雖然它有潛力,但并不適合所有人。 主要限制包括價格高昂(每月 20 美元)、需要更新的硬件(僅支持 M 系列處理器型號)、尚不支持中文以及潛在的隱私問題。 等待。
因此,在試用期間,我也產生了一個想法:我可以自己復制嗎? 錄制的是視頻,我認為這有點不必要,也不方便處理。 最好簡化為“如何以更高的頻率定期截圖”,這樣仍然可以滿足備忘錄的需求,并且生成的格式更加通用。
但聽起來還是很復雜。 我們不妨將其分解為以下幾個具體問題,然后一一解決:
下面,我先提供一下我做出的解決方案,然后詳細講解一下制作流程和相關原理。 即使您不需要定期截取屏幕截圖,了解本文中介紹的技術也將有利于 macOS 中的高級自動化。
快速使用 shell 腳本,然后: 將其放在任意固定目錄中。 按照Unix慣例,這種自制腳本一般可以放在~/bin目錄下; 在終端執行chmod +x ~/bin/命令為其添加執行權限; xyz.cyhsu...plist,然后:放在 ~ /// 目錄下。 你可以按-Shift-G然后粘貼上面的路徑直接到達這個隱藏目錄; (重要)使用或其他文本編輯器打開此plist文件,并將第9行的內容更改為您存儲上述腳本的實際路徑。 注意,如果路徑中涉及~,需要擴展為完整的/Users/[],其中[]是你的用戶名; 使用brew安裝文本識別,并下載簡體中文OCR識別所需的數據集,然后根據您的Mac處理器類型將其放置在以下目錄中,其中[]指的是實際安裝的版本號:單擊Apple菜單>“在“系統設置”中,在“隱私和安全”中選擇“屏幕錄制”,然后單擊加號形狀的“添加”按鈕,并確保以下各項均已添加到列表中(仍然可以通過按來跳轉文件選擇窗口) -Shift-G 快捷鍵然后粘貼路徑):在終端中執行 load ~///xyz.cyhsu ...plist。
這樣就可以在~//目錄下看到帶時間戳的PDF格式截圖,每半分鐘一次。 如果連接了外部顯示器,將單獨捕獲每個屏幕。
根據機器性能和屏幕截圖大小,每個屏幕截圖將在創建后大約一兩分鐘內被壓縮并識別文本。 之后就可以通過你習慣的工具來搜索文本內容了。
這個自動化過程將在后臺繼續運行,并在啟動時自動啟動。 如果需要停止,可以在終端中執行~///xyz.cyhsu...plist來卸載。 如果不再需要此功能,只需刪除上述步驟中下載的兩個文件即可。
原理與討論
為了方便閱讀,以下是腳本內容:
#!/bin/bash
outpath="$HOME/Pictures/Rewind"
mkdir -p "$outpath"
nDisplay=$(system_profiler SPDisplaysDataType | grep -c Resolution)
ts=$(date +%Y%m%d%H%M%S)
# Detect whether ocrmypdf is installed
if ! command -v ocrmypdf &>/dev/null; then
echo "ocrmypdf could not be found"
exit
else
omp=$(command -v ocrmypdf)
fi
# Capture screenshots
echo "Capturing at $ts"
capture=$(
for ((i = 1; i <= nDisplay; i++)); do
echo "$outpath/capture.$ts.$i.pdf"
done
)
echo "$capture" | xargs screencapture -x -t pdf 2>&1 && echo "Captured"
# OCR output files
for ((i = 1; i <= nDisplay; i++)); do
taskpolicy -b\
"$omp" "$outpath/capture.$ts.$i.pdf" "$outpath/capture.$ts.$i.pdf" \
-l chi_sim+eng\
--output-type pdf\
--optimize 3
done
在后臺創建屏幕截圖:使用
這是最簡單的步驟:macOS 附帶了一個用于截屏的命令。 它的基本用法是FILE,其中FILE是輸出截圖文件的名稱。
另外,可以使用-x選項禁用截圖聲音,并使用-t [jpg|png|pdf|tiff]選項指定輸出格式。 (更多選項和用法,請參閱手冊頁 man。請不要錯過 Apple 工程師對編寫糟糕的文檔的抱怨 - 快二十年過去了,還沒有人回應)。
在這里,我們選擇將屏幕截圖保存為PDF格式。 主要原因是PDF可以直接將接下來識別的文本內容以文本疊加的形式保存在文件中,用途非常廣泛,也易于檢索; 而PNG格式只能寫在注釋中。 在其他地方,第三方工具支持有限,并且很容易在跨系統傳輸中丟失。
PDF可以將下一個識別的文本內容以文本疊加的形式直接保存在文件內部。
另一個需要考慮的細節是外部顯示器的場景。 支持多個監視器,但笨拙的語法需要在參數中寫入每個監視器的屏幕截圖的文件名。 為此:
我們首先獲取當前的顯示信息,使用grep統計提到“”()的次數,然后我們就知道總共有多少個屏幕(第5行); 然后檢索消除截圖,我們使用 for 循環構建一個帶有顯示序列號和時間戳的多個文件名(使用日期實現,第 6 行),可以使用 xargs(第 23 行)將其饋送到一起。
另一個煩人的事情是,隨著 macOS 加緊權限管理,屏幕錄制也成為重點目標。 如果不進行設置,通過后臺腳本靜默執行的截圖操作只能截取一個空桌面。
為此,我們需要在“系統設置”>“隱私與安全”>“屏幕錄制”中將腳本中涉及截圖操作的所有程序添加到白名單中。
在這里,我們的腳本:
因此,需要將上述三項對應的可執行文件添加到白名單中才能正常截圖。 這就是為什么需要開頭提到的步驟 4 的原因。
識別文本并壓縮截圖大小:使用
過去曾發表過一篇關于如何從掃描的 PDF 中檢索文本的文章。 本文遵循該文章中描述的用法。 唯一常用的選項是 -- 3; 據此,這是指對圖像進行相對激進的有損壓縮,特別適合“只要看得清楚”的場景,例如截圖并保存為文件。 。
實際空間使用情況是多少? 我的工作環境是 16 英寸 Pro 搭配 4K 分辨率顯示器。 壓縮后,內置和外接顯示器的屏幕截圖的PDF大小一般在200KB和400KB以內,總大小一般不超過600KB。 即使經過壓縮,截圖質量也非常好。 除了部分顏色較多的圖片出現色階外,完全不影響觀看。
如果每天使用10小時,每半分鐘截圖一次,這相當于每天約700MB,每月約21GB,與廣告宣傳的14-39GB類似。 考慮到現在的Mac起步至少256GB檢索消除截圖,只要定期清理,我認為這個使用量是可以接受的。
讓任務定時執行并開機自動啟動:使用
這是本文解決方案中的一個關鍵環節,也是我推薦讀者了解是否需要本文的一個技巧。
說到定時執行任務,有一定Linux基礎的讀者可能會想到經典的cron。 macOS 確實保留了 cron,但它也有一個更原生的“升級版”,那就是。 正如蘋果手冊頁所說,macOS 充分吸收了 cron 的功能,并且更加靈活。
那么是誰呢? 作為一個init程序,它對于macOS來說有著重要的意義。 它是系統啟動后加載的第一個進程。 它負責初始化系統并啟動各種進程和服務。 可以說扮演著“旗手”和“總指揮”的角色。 當然,啟動和計劃任務也是功能的一部分。
該行為是通過稱為“屬性列表”(plist) 的 XML 格式的配置文件指定的。 這個配置文件安裝到系統指定的幾個位置后就變成了or。 就本文而言,您所需要做的就是制作一個文件并將其安裝在~//下,這意味著為當前登錄的用戶啟動和控制特定操作。
這是我們在開始步驟中提供的 plist 文件。 下面,我們簡單介紹一下它的結構和功能。
Label
xyz.cyhsu.script.rewind
ProgramArguments
/Users/platyhsu/bin/rewind
EnvironmentVariables
PATH
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
StartInterval
30
RunAtLoad
StandardOutPath
/tmp/rewind.log
如果你想讓別人按時為你完成一項任務,你顯然需要解釋清楚要做什么、什么時候做以及如何做。 內容大致就是回答這些問題。
具體來說,這個XML文件包含一個字典,它下面的鍵描述了要執行的任務(作業)的各種屬性。 更關鍵的屬性包括:
標簽 任務的標簽僅用于識別和區分的目的。 理論上可以隨便填寫,但約定是使用反向DNS命名。 如果您有自己的域名,您可能需要將其倒置在標簽的開頭,就像我在示例文件中所做的那樣。
核心配置項是指要執行的命令。 請注意,這是一個數組類型。 數組中的每個字符串對應一個參數,要運行的命令是第一個參數。
例如,如果要運行 ls -a /etc 命令,請注意它被空格分為三部分:命令名、選項和路徑參數,因此應將其拆分為三個元素并編寫:
ProgramArguments
ls
-a
/etc
這里,我們要執行的是一個現成的腳本文件~/bin/,所以只需用一個字符串來存儲它的路徑即可。 正如一開始提到的,需要注意的是,這里不支持變量,也不支持~之類的縮寫。 只能填寫絕對路徑。(按住該鍵并右鍵單擊目錄可以看到復制路徑的選項。)
指運行程序的環境變量。 加載器的環境和我們通過終端工具訪問的命令行環境不同。 就本文而言,這種差異的主要影響是它的默認搜索路徑(即PATH變量的值)不包括軟件安裝的目錄,因此無法直接運行諸如此類的工具。 這需要通過按鍵進行調整。
它也是一個單詞的典型鍵,其下的每個鍵值對用于分配一個變量。 這里,我們將安裝路徑 /opt//bin (M 系列處理器版本)和 /usr/local/bin (Intel 處理器版本)添加到 PATH 變量的開頭(第 11-15 行)。
指運行任務之間的時間間隔,單位為秒。 我這里填的是30秒,對于召回和打撈操作記錄來說,這個粒度應該足夠細了。 當然,您可以根據自己的喜好隨意調整。
一個布爾值,如果為 true,則任務在加載后立即開始運行。 否則,任務將等待直到滿足運行條件(在本例中,自加載以來已經過了一段時間)才開始運行。
指運行任務得到的命令行輸出()保存在哪里,非常適合記錄日志。 這里,我指定 /tmp/.log 作為日志路徑,并在腳本中傳遞 2>&1(第 23 行),以將可能遇到的任何錯誤消息重定向到標準輸出。 這個路徑沒有什么特別的,但是/tmp的好處是重啟后會自動清除,無需手動清除日志。
如果不需要日志,也可以刪除該鍵。
完成文件后,將其放在~//目錄下即可完成安裝。 如果您使用的是 macOS 或更高版本,您還會看到一個彈出通知,告訴您已添加新的后臺項目(盡管措辭非?;靵y)。
最后,正如開頭提到的,我們需要通過控制程序來加載這個,即在終端中執行load ~///xyz.cyhsu...plist。
就本文而言,了解上述級別就足夠了。 如果您想了解更多使用方法,可以參考以下資源:
節省處理器資源:使用
突出的特點之一是針對蘋果進行了優化,占用系統資源更少。 畢竟,沒有人愿意因為備份功能而干擾自己的日常工作。 我們如何在我們的山寨版本中模擬這一點?
您可能知道,macOS 與其他基于 Unix 的系統一樣,支持通過nice 命令設置進程優先級。 Nice 值是 -20 到 19 之間的整數。0 是默認值。 值越大,優先級越低(因為流程越好,越“文明禮貌”)。 查看手冊,確實有一個叫Nice的選項,是用來設置優先級的。
然而,在經過蘋果高度修改的當代 macOS 上,nice 的實際意義很小。 (見解釋)尤其是在采用大小核架構的Apple上,不可能通過設置較高的nice值來綁定進程運行在節能小核上。
因此,我們需要一個更適合當代 macOS 的工具。 查閱手冊(man)表明,在命令之前添加 -b 可以讓進程以所謂的“后臺”優先級運行。 對于蘋果來說,這是確保進程在小內核上運行的少數方法之一。 (研究仍然建議閱讀。)這就是腳本第 27 行的來源。
那么,強制使用小核對腳本執行效率有多大影響呢? 在我配置為M1 Max的Pro上,如果不進行任何設置,處理內部和外部屏幕的截圖大約需要20秒; 強制使用小核心后,這個過程延長到100秒左右。 考慮到我們很少需要立即“回憶”剛剛捕獲的屏幕截圖,所以延遲兩分鐘是可以接受的。
擴展應用程序通過命令行更快地找到屏幕截圖
第一步演示了使用系統內置搜索查找屏幕截圖內容的效果。 但如果您習慣使用命令行,我建議將 -all 與 fzf 結合使用來快速(快得快)檢索 PDF 文件。 具體方法可以看一下。
批量刪除某段時間之前的截圖
雖然我們的腳本通過壓縮截圖并在截圖文件名中添加時間戳來控制大小以便于檢索,但定期清理未使用的截圖也是有必要的。 為此,我們可以使用find命令的-選項來查找在特定時間段之間或之前和之后創建的文件,然后使用-選項來批量刪除它們。
請參閱以下示例。 語法可以說是白話,一看就明白意思:
# 列出并刪除一個月之前創建的截圖
find ~/Pictures/Rewind -not -newerct "1 month ago" -delete
# 列出最近 10 小時創建的截圖
find ~/Pictures/Rewind -newerct "10 hours ago"
您可以根據自己的喜好預先編寫一些常用的清理命令,然后使用快捷命令、快捷方式等工具將其打包成一鍵快捷方式。