我想为目录中的所有文件创建一个 md5 校验和列表。
我想要cat filename | md5sum > ouptput.txt
。我想要对目录中的所有文件执行 1 个步骤。
任何帮助都将非常有帮助。
答案1
您可以传递md5sum
多个文件名或 bash 扩展:
$ md5sum * > checklist.chk # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK
如果您想要更高级的功能,您可以使用诸如find
深入挖掘和过滤文件之类的功能,以及递归工作:
find -type f -exec md5sum "{}" + > checklist.chk
答案2
一个好的校验和创建/验证程序是rhash
。
它可以创建 SFV 兼容文件,并检查它们。
它支持 md4、md5、sha1、sha512、crc32 以及许多其他。
它可以像或一样进行递归创建(
-r
选项)。md5deep
sha1deep
最后但同样重要的是,您可以格式化校验和文件的输出。例如:
rhash --md5 -p '%h,%p\n' -r /home/ > checklist.csv
输出一个 CSV 文件,其中包含从目录开始递归的文件完整路径
/home
。
我还发现-e
通过在名称中插入 crc32 和来重命名文件的选项非常有用。
请注意,您还可以md5sum
在rhash
PhoenixNL72 示例。
答案3
以下是两个更为详细的例子:
在每个尚不存在 md5 文件的目录中创建一个具有绝对路径的 md5 文件:
find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] && md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done
在每个尚无 md5 文件的文件夹中创建一个 md5 文件:没有路径,只有文件名:
find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] && md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done
1 和 2 之间的区别在于文件在生成的 md5 文件中的呈现方式。
这些命令执行以下操作:
- 为当前文件夹建立目录名称列表。(树)
- 对文件夹列表进行排序。
- 检查每个目录中是否存在文件@md5sum.md5。如果存在,则输出“Skipped”,如果不存在,则输出“Processing”。
- 如果@md5Sum.md5 文件不存在,md5Sum 将生成一个包含文件夹中所有文件的校验和的文件。5) 将生成的@md5Sum.md5 文件设置为只读。
整个脚本的输出可以重定向到文件(.....;done > test.log)或通过管道传输到另一个程序(如 grep)。输出只会告诉您跳过了哪些目录以及已处理了哪些目录。
成功运行后,您将在当前目录的每个子目录中得到一个@md5Sum.md5 文件
我将文件命名为@md5Sum.md5,因此它将列在 samba 共享目录的顶部。
可以通过以下命令验证所有@md5Sum.md5 文件:
find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt
之后,您可以使用 grep -v OK 搜索 checklog.txt 以获取所有不同的文件的列表。
要在特定目录中重新生成@md5Sum.md5,例如当您更改或添加文件时,请删除@md5Sum.md5 文件或重命名它并再次运行生成命令。
答案4
这是我的:
time find dirname/|xargs md5sum |tee dirname.md5
当它尝试为目录计算时会引发错误,但对我来说已经足够了。