我想知道如何从当前目录中的文件(超过指定大小的文件)创建包含 md5sum 的列表。我可以执行其中一种操作,但我不知道如何将两者结合起来。
答案1
您可以通过管道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 在评论中所写,您可以+
在 后面放置{}
,即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 的所有后续参数都被视为命令的参数,直到';'
遇到由 组成的参数。 该字符串'{}'
在命令的参数中出现的所有地方都被替换为正在处理的当前文件名,而不仅仅是在单独出现的参数中,就像 find 的某些版本一样。 这两种构造可能需要转义(使用'\'
)或用引号引起来,以防止它们被 shell 扩展。 有关使用该-execdir
选项的示例,请参阅 EXAMPLES 部分。 为每个匹配的文件运行一次指定的命令。