Bash获取文件夹中所有文件的md5sum

时间:2012-06-20 07:43:20

标签: bash md5sum

您好我正在查看目录中正在更改的文件我想获取每个文件的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

=== EDIT2 ===

不完全确定为什么没有找到其中一些文件 / SYS /类/背光/ intel_backlight /亮度

还有许多其他人认为有这么多文件因某种原因无法找到

2 个答案:

答案 0 :(得分:13)

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中已删除的文件。

答案 1 :(得分:0)

如果您的文件列表大小足够小,您可以在内存中完成所有操作,您可以考虑通过哈希对before.txt进行排序。如果对after.txt执行相同操作,则可以逐行逐行查找每个文件并确定匹配项,即使文件名已更改。您还可以跳过已删除或添加的文件,与您必须解释diff before.txt after.txt

相比,问题更少

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