-exec xargs 和 -print0 的用法是什么?

Jam*_*ond 24 shell

我认为这些是将一个命令的结果作为输入传递给下一个命令的常用方法。

这三个是如何工作的?或者有哪些网站/网址?

njd*_*njd 28

首先要输入的内容:

man find

man xargs
Run Code Online (Sandbox Code Playgroud)

find命令默认将结果打印到标准输出,因此-print通常不需要该选项,但-print0使用 0 (NULL) 字节分隔文件名,以便可以正确解释包含空格或换行符的名称。

-exec您可以使用该选项代替 xargs - find 命令为它找到的每个项目执行一个命令。

xargs命令读取空格或换行符分隔的字符串(通常来自find命令,但它们可以来自任何地方)并为每个字符串执行一些命令。
如果 xargs 使用-0选项运行,它将期望以 NULL 分隔的字符串作为输出find ... -print0

xargs 的优点是它可以将字符串组合在一起,因此它只执行一个命令一两次而不是n次。

所以在正常使用中:

find start_directory -name '*.txt' | xargs ls -l 
Run Code Online (Sandbox Code Playgroud)

find将列出文件名,而xargs将发出如下命令:

ls -l file1.txt file2.txt file3.txt ... fileN.txt
Run Code Online (Sandbox Code Playgroud)

这比让您的 find 命令发出更快:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt
Run Code Online (Sandbox Code Playgroud)


jll*_*gre 9

请注意,当前可能都支持此 POSIX 语法的 find 实现不再需要 xargs:

find directory -name '*.txt' -exec ls -l {} + 
Run Code Online (Sandbox Code Playgroud)

这比 xargs 变体更简单,速度也稍快。

find directory -name '*.txt' | xargs ls -l 
Run Code Online (Sandbox Code Playgroud)

  • 那是反过来的。管道到 xargs 将使用比 -exec 稍多的资源。您可能忽略了“+”终止符。 (8认同)