Bug*_* J. 6 terminal bash md5sum
我想知道如何从当前目录中的文件(超过指定大小的文件)创建一个包含 md5sums 的列表。我可以做一个或另一个,但我不知道如何将两者结合起来。
您可以通过管道find
(它将列出您感兴趣的所有文件)输出到md5sum
.
xargs
需要避免创建循环。
把它写在一个命令中:
find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum
.
说“开始列出当前目录中的项目”-maxdepth 1
指定仅列出此目录中的文件(不深入)-size +30M
指定仅列出超过 30 兆字节空间的文件(如果需要,您也可以使用k
和G
后缀,如果需要,请阅读有关其可能性的更多信息man find
)-type f
避免列出目录 - 你不能算md5sum
目录-print0
find
使用空字节制作单独的文件名。我们使用它是因为当您在文件名中添加换行符时,一切都会失败。xargs
将从标准输入中获取内容(感谢-0
标记它将空字节视为记录分隔符)并将它们作为参数提供给md5sum
.
您也可以在没有管道的情况下制作它,但我发现语法令人困惑,我更喜欢将其通过管道传输到xargs
:
find . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;
而且,正如@David 在评论中所写,您可以将, ie放在+
后面。{}
find . -maxdepth 1 -size +30M -type f -execdir md5sum {} + \;
它有什么变化?md5sum
可以通过两种方式调用两个文件:md5sum file1; md5sum file2
或md5sum file1 file2
. 没有+
你得到第一个选项,添加+
结果以第二种方式执行它。最重要的好处是速度,因为md5sum
只执行一次。这对某些程序可能不是那么有益,但对于某些情况,例如一个程序可以在多个内核上运行,并将工作速度提高 NUM_CPUS 倍。
关于那个奇怪的语法(来自man find
):
-execdir 命令;
执行命令;
true
如果0
状态返回。find 的所有以下参数都被视为命令的参数,直到';'
遇到由 of 组成的参数。该字符串'{}'
被当前正在处理的文件名替换,它出现在命令的参数中的任何地方,而不仅仅是在它单独出现的参数中,就像在某些版本的 find 中一样。这两种结构都可能需要转义(使用 a'\'
)或引用以防止它们被 shell 扩展。有关使用该-execdir
选项的示例,请参阅示例部分。指定的命令对每个匹配的文件运行一次。
归档时间: |
|
查看次数: |
495 次 |
最近记录: |