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

Wal*_*ler 96 command-line

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

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

任何帮助都会很棒。

Oli*_*Oli 146

您可以传递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
Run Code Online (Sandbox Code Playgroud)

如果你想变得更有趣,你可以使用诸如find向下钻取和过滤文件之类的东西,以及递归工作:

find -type f -exec md5sum "{}" + > checklist.chk
Run Code Online (Sandbox Code Playgroud)


小智 16

一个很棒的校验和创建/验证程序是 rhash。它甚至可以创建 SFV 兼容文件,并对其进行检查。

它支持 md4、md5、sha1、sha512、crc32 和许多其他。

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

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

rhash --md5 -p '%h,%p\n' -r /home/
Run Code Online (Sandbox Code Playgroud)

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

我发现即使 -e 选项通过将 crc32 sum 插入 name 来重命名文件也非常有用。

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


小智 7

这里有两个更广泛的例子:

  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 
    
    Run Code Online (Sandbox Code Playgroud)
  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 
    
    Run Code Online (Sandbox Code Playgroud)

1 和 2 之间的不同之处在于文件在生成的 md5 文件中的显示方式。

这些命令执行以下操作:

  1. 为当前文件夹构建一个目录名称列表。(树)
  2. 对文件夹列表进行排序。
  3. 如果文件@md5sum.md5 存在,请检查每个目录。存在则跳过,不存在则输出Processing。
  4. 如果@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
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用 grep -v OK 对 checklog.txt 进行 grep 以获取所有不同文件的列表。

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