「xargs(1)」-

从标准输入中构建并执行命令

命令语法格式

xargs [options] [command [initial-arguments]]

命令描述

本手册页记录了GNU版本的xargs命令。命令xargs从标准输入中读取项目,由空白或换行符分隔(空白可以使用双引号、单引号、反斜杠保护),并执行initial-arguments后跟从标准输入中读取的项的command一次或多次(命令默认为/bin/echo)。标准输入上的空行将被忽略。

构建命令的命令行,直到达到系统定义的限制(除非使用-n和-L选项)。将根据需要多次调用指定的命令,以用完所有输入项。通常,命令的调用次数将少于输入中的项目。这通常会带来显着的性能优势。有些命令也可以并行执行;请参阅-P选项。

因为Unix文件名可以包含空白和换行符,所以这种默认行为通常是有问题的;包含空白、换行符的文件名会被xargs错误处理。在这些情况下,最好使用-0选项,以防止此类问题。使用此选项时,您需要确保为xargs生成输入的程序也使用NUL字符作为分隔符。例如,如果该程序是GNU的find命令,则其-print0选项会生成NUL分隔的项目列表。

如果命令command的任何调用以状态255退出,则xargs将立即停止,而不再读取任何进一步的输入。发生这种情况时会在标准错误上发出一个错误消息。

命令支持的选项及含义

-0, –null
来自标准输入的项之间是由空字符(NUL)终止的,而不是空白字符,并且引号、反斜杠不是特殊的(每个字符都按字面意思)。禁用文件字符串的结尾,该字符串与任何其他参数一样。

当输入项中可能包含空格、引号、反斜杠时,该选项很有用。GNU的find命令的-print0选项生成适合此模式的由空字符(NUL)分隔输入项目。

-a file, –arg-file=file
从文件中读取项目,而不是标准输入。如果使用此选项,则在运行命令时,标准输入保持不变。 否则,标准输入重定向自/dev/null中。

–delimiter=delim, -d delim
输入项目由指定的字符delim终止。指定的分隔符delim可以是单个字符;C风格的字符转义符,例如“\n”;八进制或十六进制转义码。printf命令可以理解八进制和十六进制转义码。不支持多字节的字符。处理输入时,引号、反斜杠并不特殊;输入中的每个字符都是字面意思。选项-d禁用任何文件结束字符串,该字符串与任何其他参数一样。当输入由简单的换行分隔的项组成时,您可以使用此选项,尽管你在程序设计中应该尽可能的使用–null选项。

-E eof-str
将文件结尾(EOF)字符串设置为eof-str。如果文件结尾(EOF)字符串作为输入行出现,则忽略输入的其余部分。如果既不使用-E选项,也不使用-e选项,则不使用文件结尾(EOF)字符串。

-e[eof-str], –eof[=eof-str]
此选项与-E同义。 请改用-E,因为-E与POSIX兼容,而此选项则不是。如果省略eof-str,则文件字符串没有结尾。 如果既不使用-E选项,也不使用-e选项,则不使用文件字符串的结尾。

-I replace-str
将参数initial-arguments中出现的replace-str替换为从标准输入中读取的项。另外,不带引号的空白不会终止输入项;相反,分隔符是换行符(LF)。隐含了-x-L 1

-i[replace-str], –replace[=replace-str]
如果指定了replace-str,则此选项与-I replace-str同义。如果缺少replace-str参数,则等同于-I{}相同。不推荐使用此选项;推荐使用-I代替。

-L max-lines
每个命令command执行时,最多使用max-lines非空白输入行。尾随空白导致输入行在下一个输入行上逻辑上继续。 隐含了-x选项。

-l[max-lines], –max-lines[=max-lines]
与-L选项的同义。与-L不同,参数max-lines是可选的。如果未指定max-lines,则默认为1。不推荐使用-l选项,因为POSIX标准指定了-L选项。

-n max-args, –max-args=max-args
每个命令行最多使用max-args参数。 如果超出大小(参见-s选项),将使用少于max-args的参数,除非给出-x选项,在这种情况下xargs将退出。

-P max-procs, –max-procs=max-procs
一次运行max-procs进程;默认值为1。如果max-procs为0,则xargs将一次运行尽可能多的进程。使用-n选项或-L选项和-P;否则很可能只会有一次执行。当xargs运行时,您可以向其进程发送SIGUSR1信号,以增加同时运行的命令数,或者发送SIGUSR2以减少数量。您不能将其增加到“实现定义”的限制之上(使用–show-limits显示)。你不能将它降低到1。xargs永远不会终止它的命令;当被要求减少时,在启动另一个之前,它只是等待多个现有命令终止。

请注意,由被调用的进程来正确管理对共享资源的并行访问。例如,如果其中多个尝试打印到标准输出,则输出将以不确定的顺序生成(并且很可能混合),除非进程以某种方式协作以防止这种情况。使用某种锁定方案是防止此类问题的一种方法。通常,使用锁定方案有助于确保正确的输出,但降低性能。如果您不想容忍性能差异,只需安排每个进程生成一个单独的输出文件(或以其他方式单独使用资源)。

-p, –interactive
提示用户是否运行每个命令行并从终端读取一行。如果响应以“y”或“Y”开头,则仅运行命令行。隐含了-t选项。

–process-slot-var=name
在每个正在运行的子进程中,将环境变量名称设置为唯一值。子进程退出后,将重用这些值。 例如,这可以用在基本负载分配方案中。

-r, –no-run-if-empty
如果标准输入不包含任何非空白,请不要运行该命令。 通常,即使没有输入,命令也会运行一次。 此选项是GNU扩展。

-s max-chars, –max-chars=max-chars
每个命令行最多使用max-chars字符,包括command、initial-arguments、参数字符串末尾的终止空值。

允许的最大值取决于系统,并计算为exec的参数长度限制,减去环境的大小,减去2048字节的净空。 如果此值大于128KiB,则使用128Kib作为默认值;否则,默认值是最大值。 1KiB是1024字节。 xargs自动适应更严格的约束。

-x, –exit
如果超出大小(请参阅-s选项),则退出。

–show-limits
显示命令行长度限制,该值由操作系统强加的、xargs选择的缓冲区大小、-s选项。 如果您不希望xargs执行任何操作,则从/dev/null管道输入(并且可能指定–no-run-if-empty)。

-t, –verbose
在执行命令之前,先在标准错误上打印。

其他选项

–version
显示版本信息并退出。

–help
显示帮助信息并退出。

注意事项

选项-L与-I选项不兼容,但也许不应该。

安全地使用xargs是不可能的,因为输出文件列表的生成与它们在xargs发出的命令中的使用之间,总会存在时间差。如果其他用户可以访问系统,他们可以在此时间窗口内对文件系统进行操作,以强制xargs运行的命令的操作你不想要的文件。有关此问题和相关问题的更详细讨论,请参阅findutils Texinfo文档中的“安全注意事项”一章。命令find的的-execdir选项通常可以用作更安全的替代方案。

使用-I选项时,从输入读取的每一行都在内部进行缓冲。这意味着当与-I选项一起使用时,xargs将接受的输入行长度有一个上限。要解决此限制,可以使用-s选项来增加xargs使用的缓冲区空间量,还可以使用额外的xargs调用来确保不会出现很长的行。例如:

somecommand | xargs -s 50000 echo | xargs -I ‘{}’ -s 100000 rm ‘{}’

这里,第一次调用xargs没有输入行长度限制,因为它不使用-i选项。 xargs的第二次调用确实有这样的限制,但是我们已经确保它永远不会遇到比它可以处理的更长的行。 这不是一个理想的解决方案。 相反,-i选项不应强加行长度限制,这就是BUGS部分中出现此讨论的原因。 find(1)的输出不会出现问题,因为它每行只发出一个文件名。

标准一致性

从GNU的xargs版本4.2.9开始,xargs的默认行为是没有逻辑文件结束(EOF)标记。 POSIX(IEEE Std 1003.1,2004版)允许这样做。

选项-l和-i出现在1997版POSIX标准中,但未出现在2004版本的标准中。 因此,您应该分别使用-L和-I。

POSIX标准允许实现对exec函数的参数大小进行限制。此限制可能低至4096字节,包括环境的大小。 要使脚本可移植,它们不能依赖更大的值。 但是,我知道没有实现会实际限制很小。 –show-limits选项可用于发现当前系统的实际有效限制。

退出状态

命令xargs会以如下状态值退出:

0 如果成功

123 如果命令的任何调用退出,状态为1~125

124 如果命令退出状态为255

125 如果命令被信号杀死

126 如果命令无法运行

127 如果找不到命令

1 如果发生其他错误

Shell使用大于128的退出代码来指示程序由于致命信号而结束。

使用示例

在目录/tmp中或下面,找到名为core的文件,并删除它们。 请注意,如果有任何包含换行符或空格的文件名,这将无法正常工作:

find /tmp -name core -type f -print | xargs /bin/rm -f

在目录/tmp中或下面,找到名为core的文件,并删除它们,以正确处理包含空格或换行符的文件或目录名称的方式处理文件名:

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

在目录/tmp中或下面,找到名为core的文件,并删除它们,但比前一个示例更有效(因为我们避免使用fork(2)和exec(2)来启动删除,而我们不需要额外的xargs进程):

find /tmp -depth -name core -type f -delete

生成系统上所有用户的紧凑列表:

cut -d: -f1 < /etc/passwd | sort | xargs echo

一个接一个地启动所需的最小Emacs副本,以编辑xargs标准输入上列出的文件。 此示例实现与BSD的-o选项相同的效果,但是以更灵活和可移植的方式:

xargs sh -c ’emacs “$@” < /dev/tty’ emacs

如上示例。

相关手册

find(1), locate(1), locatedb(5), updatedb(1), fork(2), execvp(3), kill(1), signal(7)

查看Info手册:info xargs

参考文献

  • man 1 xargs, Version xargs (GNU findutils) 4.7.0-git

更新日志

  • 08/06/2018 创建文章