当前位置: 首页>>技术问答>>正文


为目录中的所有文件生成md5校验和

,

问题描述

我想为目录中的所有文件创建一个md5校验和列表。

我想要cat filename | md5sum > ouptput.txt。我想在我的目录中的所有文件的一步中执行此操作。

任何援助都会很棒。

最佳解决思路

您可以传递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

次佳解决思路

一个伟大的校验和创建/验证程序是rhash。它甚至创建SFV兼容文件,并检查它们。

它支持md4,md5,sha1,sha512,crc32等等。

此外,它可以执行递归创建(-r选项),如md5deep或sha1deep。

最后但并非最不重要的是,您可以格式化校验和文件的输出;例如:

rhash --md5 -p '%h,%p\n' -r /home/

输出一个CSV文件,包括从/home目录开始递归的文件的完整路径。

通过在名称中插入crc32 sum,我发现甚至-e选项重命名文件也非常有用。

您可以在PhoenixNL72示例中使用”rhash”更改”md5sum”。

第三种解决思路

以下是两个更广泛的例子:

  1. 在每个目录中创建一个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 
    
  2. 在每个文件夹中创建一个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文件中的显示方式。

命令执行以下操作:

  1. 构建当前文件夹的目录名称列表。 (树)

  2. 对文件夹列表排序。

  3. 如果文件@ md5sum.md5存在,请检入每个目录。输出跳过(如果存在),输出处理(如果不存在)。

  4. 如果@ md5Sum.md5文件不存在,md5Sum将生成一个文件夹中所有文件的校验和。 5)将生成的@ md5Sum.md5文件设置为只读。

整个脚本的输出可以重定向到文件(…..;完成> 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 grep checklog.txt来获取所有不同文件的列表。

要在特定目录中重新生成@ md5Sum.md5,例如,在更改或添加文件时,请删除@ md5Sum.md5文件或重命名该文件并再次运行generate命令。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1355.html,未经允许,请勿转载。