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

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

有一个目录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

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

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

答案4

您正在寻找的程序是inotify

相关内容