我在用着inotify 工具为了监视目录中的任何文件是否已被修改:
while inotifywait -e modify /etc/checking/; do
curl...
done
尽管如此,modify
请注意监视的文件或监视目录中的文件被写给,无论书写的内容是否相同。
在发送新文件之前,curl
我想检查之前监视的文件内容是否确实已更改。
我正在考虑使用md5sum
命令来利用。
- 因此,我需要将
md5sum
每个文件的输出保存到一个数组中。有任何想法吗? - 当
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 的级别要高得多(因此有开销)。