假设有人使用 find 命令搜索与某些条件匹配的文件,并将结果通过管道传输到 rm 命令。
find / -type f -name "*.jpg" | xargs rm
首先,我不确定如果找到的文件数量很大,上面的命令是否会出错,因为我猜像 rm 这样的命令可以容纳的参数数量是有限的。
然后,我知道我可以设置一次将多少个文件作为参数传递给 rm。例如,带有 -n3 的 Xargs 会将三个参数传递给 rm 执行命令并重复它,直到所有文件都作为参数传递。
现在,我对 xargs 的 -n 选项采取的值是否有所不同?这些命令行在某些方面是否有所不同,例如执行的持续时间:
find / -type f -name "*.jpg" | xargs rm
find / -type f -name "*.jpg" | xargs -n1 rm
find / -type f -name "*.jpg" | xargs -n2 rm
find / -type f -name "*.jpg" | xargs -n3 rm
.
.
.
find / -type f -name "*.jpg" | xargs -n999 rm
答案1
您提到的限制通常与exec
所使用的缓冲区有关,而不是特定于单个命令。目的xargs
正是为了解决这个问题;xargs
将采用尽可能多的参数来提供命令。这将使您获得最少的命令调用,从而获得良好的性能。通过显式指定来减少命令的参数数量-n
在这方面不会获得任何好处。-n
在命令需要特定数量的参数的情况下,您可以使用例如,特殊情况是可以为每个参数调用一次命令。 (请注意,find
还有一个选项-exec
和一个特殊的终止符+
来促进类似的行为。)
答案2
因为我问了类似的问题:当我递归调用 md5sum 时,它产生了不同:
time find -type f -print0 | ...
... xargs -0 --max-procs 0 md5sum 37,98s user 2,45s system 99% cpu 40,464 total
... xargs -0 -n100 --max-procs 0 md5sum 41,18s user 2,66s system 327% cpu 13,374 total
... xargs -0 -n10 --max-procs 0 md5sum 45,20s user 2,93s system 573% cpu 8,396 total
... xargs -0 -n1 --max-procs 0 md5sum 45,90s user 3,01s system 591% cpu 8,263 total
find -type f -exec md5sum {} \; 37,87s user 2,62s system 99% cpu 40,596 total
正如你所看到的 -n 参数是唯一给我带来一些速度提升的东西