Shell:检查目录中的文件是否已更改

Shell:检查目录中的文件是否已更改

我在用着inotify 工具为了监视目录中的任何文件是否已被修改:

while inotifywait -e modify /etc/checking/; do
    curl...
done

尽管如此,modify请注意监视的文件或监视目录中的文件被写给,无论书写的内容是否相同。

在发送新文件之前,curl我想检查之前监视的文件内容是否确实已更改。

我正在考虑使用md5sum命令来利用。

  1. 因此,我需要将md5sum每个文件的输出保存到一个数组中。有任何想法吗?
  2. modify事件被触发时与之前的md5sum事件进行比较

我在用着#!/usr/bin/env sh

有任何想法吗?

答案1

您可以递归地对特定目录(/etc/checking)中的所有文件进行校验和,并将校验和代码写入文件中。然后,当您想要搜索修改时,只需通过运行列表进行比较即可。

find /etc/checking -type f -exec md5sum {} \; > checklist.chk

checklist.chk 看起来像这样:

bda7d4479b770eb055287d265b62c056  /etc/checklist/file001
83087902bc3bfea5cf8594c7d3f5c350  /etc/checklist/file002
7af7a423d53450e75fc228d6163ae9e6  /etc/checklist/file003

然后将其与清单进行比较:

md5sum -c checklist.chk

它会输出:

/etc/checklist/file001: OK
/etc/checklist/file002: OK
/etc/checklist/file003: OK

例如,您可以轻松地将其添加到 cronjob 中以每天运行它。


您还可以使用相同的命令每次输出一个新的清单并运行差异两个清单之间的命令。

答案2

我创建目录指纹可以用来解决这个问题。它为目录树中的所有文件创建指纹/校验和并将其保存在文件中,同时告诉您指纹是否已更改。

它可以安装:

$ brew install nejckorasa/tap/dir-fingerprint

并用作:

$ dir-fingerprint <path_to_directory>

与输出:

Old     [8a7b73f9671004edd50500bc7d3f1837d841a5c086011207259eb2d183823adf]
New     [8a7b73f9671004edd50500bc7d3f1837d841a5c086011207259eb2d183823adf]
@       <path_to_directory>/.fingerprint
Diff    false

.fingerprint创建文件

答案3

使用版本控制怎么样,比如git在循环中?它监视所有更改,并可以使用 输出可解析的数据git status --porcelain,您可以在其中查看它是数据修改还是新文件,并且不会显示内容是否未真正更改。例子:

$ git init
$ echo "aa" > file1
$ git add file1
$ git commit -m "initial"
$ echo "bb" > file2
$ echo "aa" > file1
$ git status --porcelain

输出:

?? file2

缺点是,它inotify与真实的文件系统紧密相连,而 git 的级别要高得多(因此有开销)。

相关内容