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 [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

交互式的运行命令,每个命令运行前都会在终端询问用户是否要执行。只有在用户响应询问时输入yY时才会去运行命令。打开此选项的同时,意味着-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命令 使用forkexec去调用 rm命令。

退出时的状态

xargs 指令退出时有以下状态:

0 执行成功
123 被调用的命令以 状态码 1-125 退出
124 被调用 的命令以 状态码 255 退出
125 被调用的命令 被 “信号量” 杀死了
126 无法执行目标命令
127 找不到目标命令
1 其他未知错误
当退出时的 状态码 大于128 时,表示程序是被 shell 程序发送的“信息量”杀死的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,161评论 2 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 从没有手机的日子到拥有2G网,再从3G网到4G网的遍布,从校园网cmcc-edu到校园各餐厅WiFi覆盖,从现金支...
    温语馆阅读 428评论 4 2
  • 端午放假回家,我妈突然和我说,让我注册个有缘网的账号,我当时感觉,嗯,这个世界疯了。然后我妈接着说,你爸像你...
    青梅为聘阅读 349评论 0 0
  • 明天 就明天吧 我和你一起远行 抛弃这四肢爬行的生活 去追寻有光的世界 对这躯体 我有多么纵容满足 就有多么深恶...
    东苇阅读 408评论 0 3