需求情景
我在Mac上有好几个分散在各处的文件夹需要备份到移动硬盘上,而且最好是增量备份的方式以节约时间。[1]需求如下:
- 每个文件夹需要分开各自备份。
- 能定时自动备份最好。
解决方案
基础软件
FreeFileSync
顾名思义,免费的文件同步软件。官方自带简体中文。
界面如图,与知名文件同步软件GoodSync(它在Mac端搜不到破解版囧)感觉功能上也相当,都能一目了然地看到文件夹&文件之间的区别。可能区别在同步算法上吧,不过我这种轻量用户也不在乎。
这个软件有个很好的功能就是能创建同步的批处理,把两侧的文件夹、同步的方向设定好,直接存为一个后缀为
ffs_batch
的文件,打开这个文件就能自动完成同步。还可以选择当出现错误、完成时如何进行,以及日志保存的位置。
进阶技巧
由于我上述的需求,我需要自己写一些脚本程序来实现了。
自动运行多个批处理,借助AppleScript
激活Spotlight搜索,输入脚本编辑器[2]以打开。
小注:我之前对AppleScript[3]完全不了解,以下还是我写的第一个小脚本。在我有限的理解里,AppleScript与操作系统高度集成,可以更方便地直接对系统进行操作。
而这次我们只需要用到打开文件[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
用来将任务交给Mac里的某个程序来做,tell application "Finder"
就是打开Finder了。 -
open
是打开文件夹或文件,有人会问“我不知道路径在AppleScript里怎么表达怎么办呢?”,有下图的人性化方案。
敲入命令choose file
,以某文件为例:
点击选取之后就会出现alias "Macintosh HD:Users:Adam:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:未命名.scpt"
的字样,这些就是输入open
之后的东西了。 -
delay
的作用是延缓下一步执行,因为每次执行一个批处理都要花一点时间,因此如果不让程序暂停,则会出错。 -
display notification
顾名思义,写个通知告诉我脚本运行了。
脚本写好之后可以将其保存成可直接执行的应用程序,第一步就大功告成了。
创建任务描述文件.plist
实现定时自动功能
同样这是我第一次接触.plist
,更详细的可见Mac下添加定时任务。
<?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>
<!-- 标准输入文件 -->
<key>StandardInPath</key>
<string>/Users/Adam/Documents/FileSync的批处理和日志文件/run-in.log</string>
<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/Adam/Documents/FileSync的批处理和日志文件/run-out.log</string>
<!-- 标准错误输出文件 -->
<key>StandardErrorPath</key>
<string>/Users/Adam/Documents/FileSync的批处理和日志文件/run-err.log</string>
</dict>
</plist>
-
<string>com.adam.foldersync</string>
是我给这个任务起的名字 - 对于
<string>/Users/Adam/Documents/FileSync的批处理和日志文件/定期同步.app/Contents/MacOS/applet</string>
,定期同步.app
是上文将AppleScript保存成应用程序生成的东西,/Contents/MacOS/applet
照抄[5]。 -
<key>Weekday</key>
和<integer>0</integer>
表示星期天,<key>Hour</key>
和<key>Minute</key>
就分别表示几点几分了。 - 保存成
com.adam.foldersync.plist
将其放入~/Library/LaunchAgents
——此为用户自定义任务项的目录。
最后一步,拧紧发条,定时任务启动!
在Mac的终端输入launchctl load ~/Library/LaunchAgents/com.adam.foldersync.plist
,便启动了这个任务。
可以输入launchctl list
查看你的任务是否在列表里,如果在的话,就成功一半了,之后就查看/Users/Adam/Documents/FileSync的批处理和日志文件/
中的日志来看执行情况吧。
尾声
当初执意要换上Mac就是因为听说Mac OS下工作(我白天的职业环境是Windows,所以这里不谈Microsoft Office生产力等)的效率高,买回来之后我也就秉承着这个提高效率的执念去研究着玩,确实也依靠Automator实现了一些。以前玩Windows的时候还没深入到自己变成的地步,所以不知道Mac OS比Windows效率高到底是真是伪,看客要是有想法敬请交流。
最后,文章转载请注明出处。(虽然我知道没人会转的)
-
当然了,TimeMachine也能达到这个目的,但是移动硬盘处的文件夹我需要上传至网盘再做一次备份。 ↩
-
对于Mac OS 10.11之前叫AppleScript编辑器 ↩
-
完整文档可参见AppleScript Programming ↩
-
文件处理的详细参见AppleScript学习笔记(五)文件夹,文件和路径 ↩