与 find 命令结合使用 xargs 的不同 -n 标志值是否会有所不同?

与 find 命令结合使用 xargs 的不同 -n 标志值是否会有所不同?

假设有人使用 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 参数是唯一给我带来一些速度提升的东西

相关内容