需求情景
我在Mac上有好幾個分散在各處的文件夾需要備份到移動硬盤上,而且最好是增量備份的方式以節(jié)約時間。[1]需求如下:
- 每個文件夾需要分開各自備份。
- 能定時自動備份最好。
解決方案
基礎(chǔ)軟件
FreeFileSync
顧名思義,免費的文件同步軟件。官方自帶簡體中文。
界面如圖,與知名文件同步軟件GoodSync(它在Mac端搜不到破解版囧)感覺功能上也相當(dāng),都能一目了然地看到文件夾&文件之間的區(qū)別??赡軈^(qū)別在同步算法上吧,不過我這種輕量用戶也不在乎。

這個軟件有個很好的功能就是能創(chuàng)建同步的批處理,把兩側(cè)的文件夾、同步的方向設(shè)定好,直接存為一個后綴為
ffs_batch的文件,打開這個文件就能自動完成同步。
還可以選擇當(dāng)出現(xiàn)錯誤、完成時如何進行,以及日志保存的位置。

進階技巧
由于我上述的需求,我需要自己寫一些腳本程序來實現(xiàn)了。
自動運行多個批處理,借助AppleScript
激活Spotlight搜索,輸入腳本編輯器[2]以打開。

小注:我之前對AppleScript[3]完全不了解,以下還是我寫的第一個小腳本。在我有限的理解里,AppleScript與操作系統(tǒng)高度集成,可以更方便地直接對系統(tǒng)進行操作。
而這次我們只需要用到打開文件[4]的功能(是不是特別低端)。
tell application "Finder"
open alias "Macintosh HD:Users:Adam:Documents:FileSync的批處理和日志文件:xxx.ffs_batch"
delay 10.0
open alias "Macintosh HD:Users:Adam:Documents:FileSync的批處理和日志文件:yyy.ffs_batch"
delay 10.0
open alias "Macintosh HD:Users:Adam:Documents:FileSync的批處理和日志文件:zzz.ffs_batch"
open alias "Macintosh HD:Users:Adam:Documents:FileSync的批處理和日志文件"
end tell
display notification "文件夾同步開始工作"
-
tell用來將任務(wù)交給Mac里的某個程序來做,tell application "Finder"
就是打開Finder了。 -
open是打開文件夾或文件,有人會問“我不知道路徑在AppleScript里怎么表達(dá)怎么辦呢?”,有下圖的人性化方案。
敲入命令choose file,以某文件為例:
獲取文件路徑方法
點擊選取之后就會出現(xiàn)alias "Macintosh HD:Users:Adam:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:未命名.scpt"的字樣,這些就是輸入open之后的東西了。 -
delay的作用是延緩下一步執(zhí)行,因為每次執(zhí)行一個批處理都要花一點時間,因此如果不讓程序暫停,則會出錯。 -
display notification顧名思義,寫個通知告訴我腳本運行了。
腳本寫好之后可以將其保存成可直接執(zhí)行的應(yīng)用程序,第一步就大功告成了。

創(chuàng)建任務(wù)描述文件.plist實現(xiàn)定時自動功能
同樣這是我第一次接觸.plist,更詳細(xì)的可見Mac下添加定時任務(wù)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 名稱,要全局唯一 -->
<key>Label</key>
<string>com.adam.foldersync</string>
<!-- 要運行的程序 -->
<key>Program</key>
<string>/Users/Adam/Documents/FileSync的批處理和日志文件/定期同步.app/Contents/MacOS/applet</string>
<!-- 運行時間 -->
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>00</integer>
<key>Hour</key>
<integer>23</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
<!-- 標(biāo)準(zhǔn)輸入文件 -->
<key>StandardInPath</key>
<string>/Users/Adam/Documents/FileSync的批處理和日志文件/run-in.log</string>
<!-- 標(biāo)準(zhǔn)輸出文件 -->
<key>StandardOutPath</key>
<string>/Users/Adam/Documents/FileSync的批處理和日志文件/run-out.log</string>
<!-- 標(biāo)準(zhǔn)錯誤輸出文件 -->
<key>StandardErrorPath</key>
<string>/Users/Adam/Documents/FileSync的批處理和日志文件/run-err.log</string>
</dict>
</plist>
-
<string>com.adam.foldersync</string>是我給這個任務(wù)起的名字 - 對于
<string>/Users/Adam/Documents/FileSync的批處理和日志文件/定期同步.app/Contents/MacOS/applet</string>,定期同步.app是上文將AppleScript保存成應(yīng)用程序生成的東西,/Contents/MacOS/applet照抄[5]。 -
<key>Weekday</key>和<integer>0</integer>表示星期天,<key>Hour</key>和<key>Minute</key>就分別表示幾點幾分了。 - 保存成
com.adam.foldersync.plist將其放入~/Library/LaunchAgents——此為用戶自定義任務(wù)項的目錄。
最后一步,擰緊發(fā)條,定時任務(wù)啟動!
在Mac的終端輸入launchctl load ~/Library/LaunchAgents/com.adam.foldersync.plist,便啟動了這個任務(wù)。
可以輸入launchctl list查看你的任務(wù)是否在列表里,如果在的話,就成功一半了,之后就查看/Users/Adam/Documents/FileSync的批處理和日志文件/中的日志來看執(zhí)行情況吧。

尾聲
當(dāng)初執(zhí)意要換上Mac就是因為聽說Mac OS下工作(我白天的職業(yè)環(huán)境是Windows,所以這里不談Microsoft Office生產(chǎn)力等)的效率高,買回來之后我也就秉承著這個提高效率的執(zhí)念去研究著玩,確實也依靠Automator實現(xiàn)了一些。以前玩Windows的時候還沒深入到自己變成的地步,所以不知道Mac OS比Windows效率高到底是真是偽,看客要是有想法敬請交流。
最后,文章轉(zhuǎn)載請注明出處。(雖然我知道沒人會轉(zhuǎn)的)
-
當(dāng)然了,TimeMachine也能達(dá)到這個目的,但是移動硬盤處的文件夾我需要上傳至網(wǎng)盤再做一次備份。 ?
-
對于Mac OS 10.11之前叫AppleScript編輯器 ?
-
完整文檔可參見AppleScript Programming ?
-
文件處理的詳細(xì)參見AppleScript學(xué)習(xí)筆記(五)文件夾,文件和路徑 ?
