Answers:
您可以find
将输出通过管道传输(它将列出您感兴趣的所有文件)md5sum
。
xargs
需要避免创建循环。
要在命令中编写它:
find . -maxdepth 1 -size +30M -type f -print0 | xargs -0 md5sum
.
说“从当前目录开始列出项目”-maxdepth 1
指定仅列出此目录中的文件(不更深层次)-size +30M
指定仅列出超过30 MB的文件(如果需要,还可以使用k
和G
后缀,如果需要,请阅读更多有关其可能性的信息man find
)-type f
避免列出目录-您不能指望md5sum
目录-print0
find
使用空字节制作单独的文件名。我们之所以使用它,是因为在文件名中添加换行符后一切都会失败。xargs
将从标准输入中获取内容(感谢-0
标记,它将把空字节视为记录分隔符),并将其作为参数提供给md5sum
。
您也可以不用管道就可以做到这一点,但是我发现语法令人困惑,我更喜欢将其管道到xargs
:
find . -maxdepth 1 -size +30M -type f -execdir md5sum {} \;
并且,正如@David在评论中所写,您可以+
在{}
,之后加上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中)。这两种构造都可能需要转义(带有'\'
)或加引号,以防止它们被外壳扩展。有关使用该-execdir
选项的示例,请参见“示例”部分。对于每个匹配的文件,指定的命令运行一次。
> checksums.md5
此“脚本”的末尾。请记住,如果checksums.md5
将其放在当前目录中,则该文件中将包含其(文件的checksums.md5
)哈希,而该哈希将是不正确的...创建一个内部具有自己的哈希的文件是一个难题。
find
,则可以-exec md5sum {} +
用来将所有匹配项传递给单个md5sum
命令(假设它们都适合单个命令行)。