如何在目录内容更新时运行命令?

oad*_*ams 31 backup monitoring directory files

有一个目录,A其内容经常被其他人更改。

我创建了一个个人目录B,用于保存A.

目前,我只是偶尔运行rsync需要的档案从备份AB。不过,我担心一些文件将被添加的可能性A,然后从取出A之前,我对他们在复制到机会B

防止这种情况发生的最佳方法是什么?理想情况下,我希望每次A更改内容时都运行当前的备份脚本。

jas*_*yan 37

如果您安装了inotify-tools,您可以inotifywait在文件或目录写入时触发操作:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done
Run Code Online (Sandbox Code Playgroud)

在这种情况下,-qq开关完全静默、-r递归(如果需要)并且-e是要监视的事件modify。来自man inotifywait

修改
监视文件或监视目录中的文件已写入。

  • `incrond` 也可能很有趣。 (7认同)
  • 对于较大的目录,您可能需要考虑使用 `--monitor` 开关(并将输出通过管道传输到您的循环),否则当 `inotifywait` 一遍又一遍地启动时会有很多开销 (2认同)
  • 我发现 _close_write_ 是监视更改时使用的更可靠的事件。_modify_ 可以对同一个文件调用多次,_close_write_ 在文件写入后关闭时被调用_once_。 (2认同)

ken*_*orb 12

试试entr命令行工具,它可以在文件更改时运行任意命令。从 2.9 版本开始,添加了目录监视选项 ( -d) 以在将新文件添加到目录时对事件做出反应。

如果将新文件添加到项目中,则运行该实用程序的示例:

$ while true; do
> echo src/* | entr -d your_command
> done
Run Code Online (Sandbox Code Playgroud)

在目录监视模式下,每个文件的父目录都隐式添加到监视列表中。

唯一的含义是,如果出现新文件,它必须退出以允许外部 shell 循环重新扫描文件系统。

这是没有目录监视选项的版本:

$ while true; do
> echo src/* src | entr your_command
> done
Run Code Online (Sandbox Code Playgroud)

这是一个更简单的示例,具体取决于您的需要:

$ ls -d * | entr sh -c 'rsync -vuar A B'
Run Code Online (Sandbox Code Playgroud)

查看:eradman.com/entrproject网站了解更多详情。


Gil*_*il' 5

严格来说,如果有人丢弃文件并很快将其删除,您可能会错过它。使用inotify(Linux 下,或其他 unice 下的类似功能)使风险窗口变小。

如果您可以在该目录上安装您选择的文件系统(我意识到这可能不是一种选择),您可以放置​​一个记录所有文件版本的文件系统,例如copyfs