xargs 与反引号

xargs 与反引号

Linux 新手提出了更多愚蠢的问题。=D

我很好奇使用 xargs 与反引号对性能的影响。

例如,两者之间有什么不同:

find ./ -name foo* | xargs rm

rm `find ./ -name foo*`

在我看来,通过管道并使用 xargs 是一种更好的做法,因为可以按顺序处理内容。

你的想法?

-M

答案1

处理更复杂的脚本时,反引号会造成麻烦;您需要小心转义反引号内容。因此,我经常将它们更改为$(...)

xargs如果有很多文件,可能会在您的示例中调用rm多次——POSIX 系统对命令参数的长度可能有上限。

xargs具有反引号所没有的其他功能:fexargs可以采用以字节分隔的参数\0来处理带空格的文件名。

答案2

如果您只处理一些不包含空格的路径名,那么它们是等效的。

在某些系统上,单个命令行(实际上是环境加上发送给执行(2)-family 调用) 受到限制(请参阅 kern.argmax)。在受限系统中,如果find产生过多的输出,shell 将无法将其全部放入周围的命令行中。为了解决这个问题,xargs获取输出find并将“单词”(是的,是单词,不是行,见下文)组合成适合单个命令行的组。

其次,xargs和 shell(通过反引号)都会将find的输出拆分为 的参数,rm方法是在每次运行空格、制表符或换行符的任意组合时对输出进行标记(这是一种简化,因为它们都有自己的引用规则,这些规则很接近,但不完全相同)。如果find -printsa 路径名为“.//foo/bar quux”,rm最终将看到两个参数(“.//foo/bar”和“quux”)。如果名为的文件quux存在于您开始的 cwd 中,那么当一切结束时它将消失(“.//foo/bar quux”仍会在那里!)。

因此,最可靠的方法是使用和find的POSIX扩展。通过协同工作,它们可用于将 输出中的任何合法路径名可靠地传输到支持这两个扩展的任何系统上任何其他命令的命令行。-print0xargs-0find

find . -name foo\* | xargs -0 rm

其稳健性来自于这样一个事实:两个扩展用来终止路径名的 NUL 字节是几乎所有(Unix-oid)操作系统中唯一不允许的字节。

答案3

如果程序支持按该顺序排列的多个参数,则反引号的执行方式应相同。由于并非所有程序都支持这样的多个参数,因此当执行反引号中的命令并返回多个结果时,就会出现问题。如果您知道后一个命令会起作用,请使用它。如果您不确定,请坚持使用xargs以确保安全。find还有一个有用的-exec开关,可以像这样使用:

find / -type f -exec grep -i word {} +

其中括号被替换为来自的当前文件匹配项find

相关内容