(Bash)如何监视目录中的文件更改(创建,删除,重命名)

时间:2017-10-17 17:45:52

标签: linux bash

在诉诸模糊问题之前,我一直试图解决这个问题几天。我知道 inotify 等工具,但作为作业的一部分,我不允许使用可以帮助您的工具。我使用watch -n 5 -d ls -l直观地显示了更改。然而,这不是我想要的。我想在删除,创建或重命名目录中的文件时将更改打印到终端。我不是在寻找一个彻底的解决方案,只是关于我应该如何解决这个问题的一些建议。

3 个答案:

答案 0 :(得分:0)

实现此目标的最佳方法可能是使用目标目录中的inodes个文件作为跟踪更改的标识符。例如,您可以在脚本启动时通过将inode存储为标识符并使​​用文件名作为键来构建hash table。一旦构建了初始表,程序将循环回到目录&表再次检查以下内容;

  • 有一个inode消失了吗?如果是这样,那么具有标识符==的密钥对于影响inode的密钥已经存在 删除。

  • 标识符和密钥是否仍与目录匹配?如果没有,则重命名文件。

  • 最后,目录中是否有新的inode出现?如果已经创建了一个新文件,那么我们需要将它和它的文件名添加到表中。

希望这会帮助你。

答案 1 :(得分:0)

您是否需要立即更改?

如果没有,bash脚本就足够了,脚本中应该有一个循环,检查目录中的所有文件,如果与上次检查不一致,则输出一些内容,然后继续。

答案 2 :(得分:0)

好吧,不使用为预期目的而编写的工具(例如inotifywait)确实会让事情变得更有趣......什么可以告诉你文件是否被修改过? (提示:如何能够为每个文件提供唯一的指纹?)这不是世界上最快的事情,但md5sum肯定会为你做到这一点。对结果进行简单的重定向即可:

$ md5sum yourdir/* > yourdir.md5

如何以某种方式添加,删除或更改文件?您需要一种方法来比较每个文件的校验和。您可以简单地使用--check的{​​{1}}选项,但这不会捕获新文件或已删除文件,只会删除已更改的文件。还有什么可以比较和识别任何新的,删除或更改的文件?想到md5sum

如果您创建新的商家信息,请说:

diff

然后调用$ md5sum yourdir/* > yourcheck.md5 来比较校验和列表?

diff

根据简单的$ diff yourdir.md5 yourcheck.md5 输出,您可以确定是否添加,删除或更改了文件。对于下一次迭代,您只需将diff复制到yourcheck.md5(因此它保存目录的当前校验和),然后在下一个时间间隔重复检查。

您还可以使用yourdir.md5选项的变体来简单地检查更改而不创建输出等,具体取决于您希望如何处理脚本流程。

现在,这不是解决问题的唯一方法,但只能使用diffmd5sum进行此操作。

您可以执行非常类似的操作,将diff替换为md5sum并存储文件模式等等。您只需要查看是否可以使用另一个经文获得任何速度优势。 。 (虽然我怀疑只是为每个文件挑选mod时间比生成每个文件的stat快得多)

还有许多其他方法可以捕获目录中文件的状态。 (就此而言,您只需将包含日期和时间的目录列表(例如md5sum)重定向到文件中ls -al,而不依赖于diffmd5sum以不同的形式捕获相同的信息)。看看你能想出什么。

关键是stat两个版本的东西。什么......取决于你。