有一个目录A
,其内容经常被其他人更改。
我创建了一个个人目录B
,其中保存了所有曾经存在过的文件A
。
目前,我只是偶尔跑去rsync
获取要备份的A
文件B
。但是,我担心某些文件可能会被添加到 中A
,然后在A
我有机会将它们复制到B
.
防止这种情况发生的最佳方法是什么?理想情况下,我希望每次内容A
更改时都运行当前的备份脚本。
答案1
如果你有inotify 工具inotifywait
安装后,如果文件或目录被写入,您可以使用它来触发操作:
#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre "attrib,modify,close_write,move,move_self,create,delete,delete_self" "$dir1"; do
/run/backup/to/B
done
其中-qq
开关完全无声,-r
是递归的(如果需要)并且-e
是要监视的事件。从man inotifywait
:
属性 监视的文件或监视的目录中的文件的元数据被修改。这包括时间戳、文件权限、扩展属性等。
调整已写入监视文件或监视目录中的文件。
关闭写入监视的文件或监视目录中的文件在以可写模式打开后被关闭。这并不一定意味着该文件已被写入。
移动文件或目录已从监视目录移出或移至监视目录。请注意,这实际上是通过侦听 moving_to 和 moving_from 来实现的,因此收到的所有关闭事件都将作为其中之一或两者输出,而不是 MOVE。
移动_自我监视的文件或目录已移动。在此事件之后,将不再监视该文件或目录。
创造在监视的目录中创建了文件或目录。
删除监视目录中的文件或目录已被删除。
删除自己监视的文件或目录被删除。在此事件之后,将不再监视文件或目录。请注意,即使没有显式侦听此事件,也可能会发生该事件。
答案2
尝试entr
命令行工具,可以在文件更改时运行任意命令。自 2.9 版本以来,添加了目录监视选项 ( -d
),以便在将新文件添加到目录时对事件做出反应。
如果将新文件添加到项目中,则运行该实用程序的示例:
$ while true; do
> echo src/* | entr -d your_command
> done
在目录监视模式下,每个文件的父目录都会隐式添加到监视列表中。
唯一的含义是,如果出现新文件,它必须退出以允许外部 shell 循环重新扫描文件系统。
这是没有目录监视选项的版本:
$ while true; do
> echo src/* src | entr your_command
> done
这是一个更简单的示例,具体取决于您的需求:
$ ls -d * | entr sh -c 'rsync -vuar A B'
查看:eradman.com/entrproject网站了解更多详情。
答案3
答案4
您正在寻找的程序是inotify
。