列出大于指定大小的文件,然后创建它们的md5sum或sha256sum


6

我想知道如何从当前目录中的文件-超过指定大小的文件中创建带有md5sums的列表。我可以做另一个,但是我不知道如何将两者结合起来。

Answers:


8

您可以find将输出通过管道传输(它将列出您感兴趣的所有文件)md5sum

xargs 需要避免创建循环。

要在命令中编写它:

find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum

  • . 说“从当前目录开始列出项目”
  • -maxdepth 1 指定仅列出此目录中的文件(不更深层次)
  • -size +30M指定仅列出超过30 MB的文件(如果需要,还可以使用kG后缀,如果需要,请阅读更多有关其可能性的信息man find
  • -type f避免列出目录-您不能指望md5sum目录
  • -print0find使用空字节制作单独的文件名。我们之所以使用它,是因为在文件名中添加换行符后一切都会失败。

xargs将从标准输入中获取内容(感谢-0标记,它将把空字节视为记录分隔符),并将其作为参数提供给md5sum

您也可以不用管道就可以做到这一点,但是我发现语法令人困惑,我更喜欢将其管道到xargsfind . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;

并且,正如@David在评论中所写,您可以+{},之后加上find . -maxdepth 1 -size +30M -type f -execdir md5sum {} + \;

它会发生什么变化?md5sum可以通过两种方式调用两个文件:md5sum file1; md5sum file2md5sum file1 file2。如果没有,则+您将获得第一个选项,+而在第二种方式中执行它会增加结果。最重要的好处是速度,因为md5sum它只执行一次。对于某些程序而言,可能不是那么有益,但是对于某些情况,例如,某个程序可以随后在许多内核上运行,并以NUM_CPUS的速度加快工作速度。

关于这种奇怪的语法(来自man find):

-execdir命令;

执行命令;true如果0返回状态。以下所有要查找的参数都将用作命令的参数,直到';'遇到由组成的参数。字符串 '{}'会被当前文件名替换,该文件名会在命令参数中出现的所有位置处进行处理,而不是仅在单独存在的参数中(例如在某些版本的find中)。这两种构造都可能需要转义(带有'\')或加引号,以防止它们被外壳扩展。有关使用该-execdir选项的示例,请参见“示例”部分。对于每个匹配的文件,指定的命令运行一次。


我会尝试的!如何将其转换为文本文件?> checksums.md5?
Bug J.

当然,只需将其放在> checksums.md5此“脚本”的末尾。请记住,如果checksums.md5将其放在当前目录中,则该文件中将包含其(文件的checksums.md5)哈希,而该哈希将是不正确的...创建一个内部具有自己的哈希的文件是一个难题。
发泡胶飞

3
如果您拥有GNU find,则可以-exec md5sum {} +用来将所有匹配项传递给单个md5sum命令(假设它们都适合单个命令行)。
David Foerster,2013年
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.