如何使用fswatch和rsync自动同步目录?

21
我想要使用rsync自动运行两个本地目录之间的单向同步。当检测到/dir1或其子目录中的文件更改时,应该运行以下命令: rsync -rtuv /dir1 /dir2 我如何用fswatch实现这个目标?
是否有可能提供rsync的参数以仅复制由fswatch事件给出的实际更改的文件?

请在 https://apple.stackexchange.com 或 https://unix.stackexchange.com 上提问。 - trojanfoe
rsync 已经非常优化,只做必要的最小更新 - 为什么不直接使用 fswatch . | while read f; do echo rsync; done?http://bryanpendleton.blogspot.co.uk/2010/05/rsync-algorithm.html - Mark Setchell
2个回答

40
alias run_rsync='rsync -azP --exclude ".*/" --exclude ".*" --exclude "tmp/" ~/Documents/repos/my_repository username@host:~'
run_rsync; fswatch -o . | while read f; do run_rsync; done

第二行无条件运行 run_rsync 一次,然后在当前目录中的每个更改上运行(或者指定确切的路径而不是.

Rsync选项:

  • -a - 代表“存档”,递归同步并保留符号链接、特殊和设备文件、修改时间、组、所有者和权限。
  • -z - 压缩
  • -P - 结合了标志--progress和--partial。前者为传输提供进度条,后者允许您恢复被打断的传输
  • --exclude - 根据模式排除文件

您需要 fswatch:

brew install fswatch

9
很棒的忍者文章。也许在fswatch之后使用-or会更好,以实现递归。 - Zoltán
2
注意:即使您排除了某些内容,fswatch仍会扫描整个目录树。https://github.com/emcrisostomo/fswatch/issues/151。也就是说,如果您有`node_modules`,它也将被完全扫描。 - vaughan
这会不会为每个更改的文件调用rsync,而实际上只需要调用一次,因为rsync也会检查哪些文件已更改? - Visionscaper
1
不,-o选项意味着--one-per-batch。请参见此处:https://github.com/emcrisostomo/fswatch/wiki/How-to-Use-fswatch#bubbling-events。 - Brian
@vaughan 哎呀,那太大了。有什么解决办法吗? - ch271828n

2

一行代码的解决方案:

function run_rsync() { rsync your_args } ; run_rsync; fswatch -o your_directory | while read f; do run_rsync; done

感谢 @Daniel 提供的启发性答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接