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


75

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

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

任何帮助都会很棒。


如何找到特定备份文件的md5sum(校验和)?-我的脚本应该是什么样的-命令是什么

Answers:


110

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

1
♦如何使用以上内容获取子目录md5sum中的文件,上面md5sum *所说的...进入子目录级别,是一个目录
Kasun Siyambalapitiya

很抱歉通过运行find -type f -exec md5sum '{}' +和`find -type f -exec md5sum'{}'` 询问,我能够得到它。谢谢:)
Kasun Siyambalapitiya '17

我更喜欢此输出的外观:openssl md5 * > checklist.txt
ashley

1
如果您使用的是一个乐于**递归评估的外壳程序(例如zsh),则它甚至更简单:md5sum **/* 2>/dev/null
Joost

12

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

它支持md4,md5,sha1,sha512,crc32等许多其他功能。

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

最后但并非最不重要的一点是,您可以设置校验和文件的输出格式。例如:

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

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

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

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


1
“ / home /”在这里到底做什么?这个工具看起来不错。
安迪·伊瓦内兹

我认为这是一个错误,对我来说肯定是错误的。-p是输出的格式。我会改正的。
pbhj

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 
    
  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文件设置为只读。

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

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


使用完整路径的命令#1:md5sum“ $ {dir}” / *不会拾取以点开头的隐藏文件。有什么补救办法吗?
user14654 2014年

晚了聚会,但是由于md5sum想要文件名(如果给它一个目录似乎很高兴),可能最容易寻求帮助:$ md5sum $(find“ $ dir” -maxdepth 0 -type f)“- “ f”类型可提取常规文件和.hidden文件(此外,find有很多选项,但可能会很有用)。如果您需要递归所有内容,请省略“ -maxdepth 0”部分。注意:如果文件名带有嵌入式空格,这是脆弱的,那么您可以阅读xargs和-0(en.wikipedia.org/wiki/Xargs
jgreve

0

我遇到了这个问题,尽管上面的解决方案很优雅,但我想针对这种情况进行快速而肮脏的破解:1个目录,其子目录深一层。

因此,在shell中输入目录并运行:

md5sum * */* 2>/dev/null > md5sum.md5

这将获取顶级目录中的所有文件,删除有关子目录为目录的错误警告,然后在子目录内容上运行md5sums。优点:容易记住,完全可以完成预期的工作。我总是对find语法感到困惑,并且永远无法记住它,因此无需循环等,处理目录名称中的空格,这一行很好用。这不是一个强大的功能强大的解决方案,不适用于> 1级的子目录,但是可以快速轻松地解决该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.