4

嗨,我正在查看目录中正在更改的文件,我想获取每个文件的 md5sum 并将其写入文本文件。然后在我知道文件已更改后,我想再次运行它,以便我可以比较输出文件以查看确切更改的内容。这是我尝试过的,但它不能按我的需要工作。

此外,我不仅需要获取文件夹中每个文件的 md5sum,包括子目录,我还需要它不遵循符号链接

#!/bin/bash
#

cd /sys/class
for i in $(find . -type f)
do
    ls -lt "$i" >> /home/george/Desktop/before.txt
done
echo "Finished!"

感谢您的任何帮助

===编辑===

我把我的实际路径放进去,因为我真的认为不需要隐藏它们。无论如何,运行它只返回几个文件(下面的输出文件),这些文件是文件夹中的文件,这意味着它不会进入子目录并找到这些文件。顺便说一句,对不起,我的 bash 生锈了

--w------- 1 root root 4096 Jun 20 03:03 ./gpio/export
--w------- 1 root root 4096 Jun 20 03:03 ./gpio/unexport
-rw-r--r-- 1 root root 4096 Jun 20 03:03 ./firmware/timeout
-r--r--r-- 1 root root 4096 Jun 20 03:04 ./drm/version

===编辑2===

不完全确定为什么找不到其中一些文件,例如 /sys/class/backlight/intel_backlight/brightness

还有许多其他类似的文件,由于某种原因找不到很多文件

4

2 回答 2

14

cd是不必要的,type -f实际上您已经在绕过符号链接。所以循环也是不必要的:

find /path/to/directory -type f -exec md5sum {} + >before.txt

如果您的find年龄太大而无法支持,请-exec {} +尝试使用-exec {} \;

为了md5sum比较,您可以尝试简单地删除相同的行;

fgrep -vxf before.txt after.txt | less

这是假设列表before.txt适合fgrep;但如果你要处理几十万个文件,它可能可以应付。但是,这不会识别已删除的文件before.txt

于 2012-06-20T07:55:34.853 回答
0

如果您的文件列表大小足够小,可以在内存中完成所有操作,则可以考虑按哈希对 before.txt 进行排序。如果您这样做,after.txt即使文件名已更改,您也可以逐行处理每个文件并识别匹配项。您还可以跳过已删除或添加的文件,而问题比必须解释diff before.txt after.txt

如果使用文件修改日期是一个选项,您可以做的是ls -lt | head过滤掉最新的文件并保留它。然后,当您想检查更改时,ls -lt再次检查比您存储日期更新的任何内容。无论文件列表大小如何,这都应该可以很好地工作,但容易受到修改最后修改日期的人的攻击(这将需要 root 权限)

于 2012-06-20T07:47:48.730 回答