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

Bug*_* J. 6 terminal bash md5sum

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

sty*_*fly 8

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

xargs 需要避免创建循环。

把它写在一个命令中:

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

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

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

您也可以在没有管道的情况下制作它,但我发现语法令人困惑,我更喜欢将其通过管道传输到xargsfind . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;

而且,正如@David 在评论中所写,您可以将, ie放在+后面。{}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 的所有以下参数都被视为命令的参数,直到';'遇到由 of 组成的参数。该字符串 '{}'被当前正在处理的文件名替换,它出现在命令的参数中的任何地方,而不仅仅是在它单独出现的参数中,就像在某些版本的 find 中一样。这两种结构都可能需要转义(使用 a '\')或引用以防止它们被 shell 扩展。有关使用该-execdir选项的示例,请参阅示例部分。指定的命令对每个匹配的文件运行一次。

  • 如果你有 GNU `find`,你可以使用 `-exec md5sum {} +` 将所有匹配项传递给单个 `md5sum` 命令(假设它们都适合单个命令行)。 (3认同)