xargs参数详解
简介
xargs指令可以从标准输⼊读取数据,并利⽤这些数据“组建”并“执⾏”指令。它的作⽤是将参数列表转换成⼩块分段传递给其他命令,以避免参数列表过长的问题。
语法
xargs  [-0prtx]  [-E  eof-str]  [-e[eof-str]]  [--eof[=eof-str]]  [--null]
[-d  delimiter]  [--delimiter  delimiter]  [-I  replace-str]
[-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]]
[-L max-lines] [--max-lines[=max-lines]] [-n max-args]
[--max-args=max-args]  [-s  max-chars]
[--max-chars=maxchars]  [-P  max-procs]  [--max-procs=max-procs]
[--process-slot-var=name]  [--interactive]  [--verbose]  [--exit]
[--no-run-if-empty]  [--arg-file=file] [--show-limits] [--version]
[--help] [command [initial-arguments]]
详解
xargs 从标准输⼊中读取使⽤“空格”或“空⾏”分隔的“数据块”,并以读⼊的“数据块”作为参数执⾏命令(默认情况下执⾏的是
/bin/echo 命令)。需要注意的是,作为参数,从标准输⼊中读⼊的“数据块”会跟随在 初始参数(initial-arguments)之后。如果你从标准输⼊读⼊的“数据块”中有些空格并⾮“数据块”的分隔,⽽是作为“数据块”的⼀部分出现;你需要把这个些带有空格的“数据块”整体放到单引号或双引号中,当然你也可以在那些“数据块”内部的空格前⽤反斜杠(\)进⾏转义。另外,标准输⼊中多余的空⾏会被忽略。
如果不使⽤ -n 和 -L 选项,并且没有遇到换⾏符的情况下,被 xargs 创建的命令的长度是“贪婪”的,直到达到系统限制的长度。⽽Command 指令被调⽤的次数正好是标准输⼊中“数据块”的⾏数。通常情况下,命令被调⽤的次数是⼩于“数据块”的数量的;这样会在⼀定程度上提⾼命令的执⾏效率。有些指令可以并⾏执⾏,请参考 -P 选项。
在 Unix 系统中,⽂件名中是可以包含空格和换⾏符的,如果不对这种“特殊情况”做处理通常是会出问题
的;这种在⽂件名中的空格和换⾏会被 xargs 当成“数据块”的分隔符处理。在这种情况下可以使⽤ -0 选项来解决问题。当使⽤这个-0选项时,你需要确保“数据块”之间使⽤null字符作为分隔符。例如:当由GNU 的 find 命令提供xargs的“标准输”时,就需要为其(find)提供 -print0 选项来达到⽬的。
如果有任何⼀次 Command 指令的调⽤以 255 的状态码退出,则xargs会⽴即停⽌,并会放弃此后的所有输⼊。错误信息会输出到“标准错误流”。
参数说明
-0, --null
当 xargs 使⽤此选项时,null字符会被作为“数据块”的分隔符,⽽引号(单引⽤和双引号)都不在具有特殊含义(所有的字符都代表他们⾃⼰);⽂件结束符(EOF)也将失效。通常情况下,当“数据块”中包含空格、引号、反斜杠时适合使⽤此选项,GNU 中的 find 命令 使⽤ -print0选项时就是这种情况。
-a file, --arg-file=file
从⽂件中读取“数据块”,⽽⾮标准输⼊。如果你使⽤此选项,除⾮“标准输⼊”已经被重定向到 /dev/null,否则,执⾏命令时不会影
响“标准输⼊”中的数据。
--delimiter=delim, -d delim
xargs 命令会以此选项指定的“特定字符”作为“数据块”的分隔符。这个“特定字符”可能是⼀个“普通字符”,也可能是⼀个C语⾔风格的转义字符(如:\n,反斜杠后进⼀个⼗六进制或⼋进制数的转义字符);这些转义字符会被 printf 函数处理后再给此选项使⽤。此选项不⽀持多字节字符(也即是仅⽀持ASCII字符集中的字符)。使⽤此选项后,标准输⼊中的引号和反斜杠都不再是特殊字符,他们仅代表⾃⾝的字⾯意思。另,-d 选项还会使 ⽂件结束符(EOF)失效,此时xargs 对待⽂件结束符与其他参数是完全⼀样的。当“数据块”中包含换⾏符时你也可以使⽤此选项来处理;虽然使⽤ --null 选项是更好的选择。
-E eof-str
设置“⽂件结束符”,xargs 在处理标准输⼊时,如果遇到“⽂件结束符”,则其后的所有输⼊都将被忽略。如果 -E 和 -e 选项都没有被使⽤,则表⽰在标准输⼊中没有字符会被当成“⽂件结束符”处理,如果不指定 -e 或 -E 标志,则采⽤下划线(_)为逻辑 EOF 字符串。如果不指定  EOFString 参数,逻辑 EOF 字符串能⼒被禁⽤且下划线被照字⾯含义使⽤。xargs 命令读取标准输⼊直到达到 EOF 或指定的字符串。。
-e [eof-str], --eof[=eof-str]
此选项和 -E 选项的功能是⼀样⼀样的。请使⽤ -E 选项,因为他是符合 POSIX 标准的,⽽此选项不是。如果使⽤此选项时 eof-str 被省略了或 -E 和 -e 选项都没有被使⽤,则表⽰在标准输⼊中没有字符会被当成“⽂件结束符”处理。
-I replace-str
⽤从标准输⼊中得到“数据块”替换 initial-arguments 中出现的 replace-str。使⽤此选项后,空格(⽆论是否在引号中)不会作为“数据块”的分隔符,只有换⾏会被作为“数据块”的分隔符。使⽤此选项,同时意味着使⽤了 -x 和 -L 1 选项。
Implies -x and -L 1.
-i [replace-str], --replace[=replace-str]
此选项与 -I 选项的功能是⼀样的。如果 replace-str 没有被指定,则使⽤默认值{},此时的功能与 -I {}是⼀样的。这个选项已经不推荐使⽤,请使⽤ -I 选项。
-L max-lines
每个命令⾏最多允许有 max-lines 个⾮空的输⼊⾏。末尾的空⽩会使⼀个输⼊⾏在逻辑上延伸到下⼀⾏。
使⽤此选项,同时意味着使⽤了 -x 选项。
重定向过多是什么意思-l [max-lines], --max-lines[=max-lines]
此选项和 -L 选项的功能是⼀样的;不同的是此选项中的 max-lines 参数是可选的。如果 max-lines 没有被指定,则使⽤默认值 1 。此选项-l 不已经不赞成被使⽤,请使⽤符合 POSIX 标准的 -L 选项代替。
-n max-args, --max-args=max-args
每个命令最多允许有 max-args 个参数。如果参数个数达不到 max-args 个,但参数的尺⼨超过了限制(请参考 -s选项);此是 xargs 程序将会退出。
-P max-procs, --max-procs=max-procs
同时运⾏ max-procs 个进程,max-procs的默认值是1。如果 max-procs被指定为0,xargs 将会尽可能的运⾏多个进程。请联同-n或-L选项⼀起使⽤,否则可能只会执⾏⼀个进程。在 xargs 运⾏期间,你可以向他发送 SIGUSR1信号量要求增加进程,或发送SIGUSR2信号量要求减少进程。但是你⽆法把进程数据减少到0,因为最⼩值是1。xargs 不会中⽌命令的执⾏,当要求减少进程时,他会等待,只到有进程执⾏完成,只是在执⾏完成的进程想要启动其他进程时会被阻⽌。
-p, --interactive
交互式的运⾏命令,每个命令运⾏前都会在终端询问⽤户是否要执⾏。只有在⽤户响应询问时输⼊y或Y时才会去运⾏命令。打开此选项的同时,意味着-t选项也被打开了。
--process-slot-var=name
在每个⼦进程中分别设置环境变量name的值为不同的值。如果在某个进程中设置的值与已经存在的进程设置的值重复了,就会退出这个进程。可以⽤此来做负载均衡。
-r, --no-run-if-empty
如果标准输⼊中没有任何⾮空的字符,则不运⾏命令;默认情况下即使标准输⼊没有⾮空字符,命令也会被运⾏⼀次。这个选项是 GNU 扩展的。
-s max-chars, --max-chars=max-chars
⼀个命令最多包含 max-chars 个字符,包括 命令本⾝、initial-arguments 和标识字符结束的 nulls 字符。这个最⼤值是依赖于操作系统的。
--show-limits
Display the limits on the command-line length which are imposed by the operating system, xargs' choice of buffer size and the -s option. Pipe the input from /dev/null (and perhaps specify --no-run-if-empty) if you don't want xargs to do anything.
-t, --verbose
在执⾏命令之前输出此命令的“标准错误流”。
-x, --exit
如果超过 -s 选项指定尺⼨,就退出程序。请参考 -s 选项。
--help
输出 xargs 命令的帮助信息,然后退出。
--version
输出 xargs 命令的版本号,然后退出。
⽰例
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 的⽂件,并删除他们。与上⾯不同的是,⽂件名或⽬录即使包含空格或换⾏符,也能被正确的处理。
find /tmp -depth -name core -type f -delete
到⽬录/tmp 和其⼦⽬录 下所有名字为 core 的⽂件,并删除他们。与上⾯两个例⼦不同的是,这样做更有效率。因为这避免了通
过xargs命令 使⽤fork和exec去调⽤ rm命令。
退出时的状态
xargs 指令退出时有以下状态:
0 执⾏成功
123 被调⽤的命令以状态码 1-125 退出
124 被调⽤的命令以状态码 255 退出
125 被调⽤的命令被 “信号量” 杀死了
126 ⽆法执⾏⽬标命令
127 不到⽬标命令
1 其他未知错误
当退出时的状态码⼤于128 时,表⽰程序是被 shell 程序发送的“信息量”杀死的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。