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

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

我想知道如何从当前目录中的文件(超过指定大小的文件)创建包含 md5sum 的列表。我可以执行其中一种操作,但我不知道如何将两者结合起来。

答案1

您可以通过管道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目录
  • -print0使用空字节创建find单独的文件名。我们之所以使用这个,是因为当你在文件名中放入换行符时,一切都会失败。

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

相关内容