xargs
从标准输出建立并运行命令行
example1
描述:输出当前目录下所有符号链接或经过压缩的ASCII文件并显示
命令:file -Lz * | grep ASCII | cut -f1 -d: | xargs ls -ltr
解释:
file -Lz *:用于查找是符号链接或者经过压缩的文件;
输出结果:
anaconda-ks.cfg: ASCII English text
install.log: ASCII text
insall.log.syslog: ASCII text
mbox: ASCII mail text
grep ASCII:用于搜索包含 "ASCII" 字符的字符串并产生;
输出结果:
anaconda-ks.cfg: ASCII English text
install.log: ASCII text
insall.log.syslog: ASCII text
mbox: ASCII mail text
cut -f1 -d:表示采用冒号作为分隔符,并取出第一列。所以尽显示文件名;
输出结果:
anaconda-ks.cfg
install.log
install.log.syslog
mbox
xargs:将上述列表作为参数进行传递,一次传递一个。
xargs ls -ltr:用于接收输出并对其执行 ls -ltr 命令,命令等价于:
ls -ltr anaconda-ks.cfg
ls -ltr install.log
ls -ltr install.log.syslog
ls -ltr mbox
结果:
大家应该都知道了吧。
xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。
example2
描述:计算当前目录下各个文件行数:
命令:file * | grep ASCII | cut -f1 -d: | xargs wc -l
解释:(无)
结果:
40 anaconda-ks.cfg
452 install.log
53 install.log.syslog
68 mbox
613 total
example3
描述:用vi打开匹配后的文件
命令:file * | grep ASCII | cut -f1 -d: | xargs vi
解释:
该命令使用 vi 逐个打开文件。当您希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。
example4
描述:快速重命名目录中的文件。
命令:ls | xargs -i mv {} {}.old
解释:
-i 选项告诉 xargs 用每项的名称替换 {}。
xargs还有几个选项:
-p 选项;它使操作具有可交互性:
命令: file * | grep ASCII | cut -f1 -d: | xargs -p vi
此处的 xarg 要求您在运行每个命令之前进行确认。如果您按下 "y",则执行命令。
-t 选项;使用一个详细模式,显示要运行的命令,是调试过程中一个非常有帮助的选项。
如果传递给 xargs 的输出为空怎么办?考虑以下命令:
命令:file * | grep 12345 | cut -f1 -d: | xargs -t wc -l
wc -l
0
此处,搜索 "12345" 后没有匹配的内容;因此 xargs 的输入均为空,如第二行所示(由于我们使用 -t 这个详细选项而产生的结果)。
-r选项;虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,您可能希望停止 xargs;如果是这样,可以使用 -r 选项:
命令: file * | grep 12345 | cut -f1 -d: | xargs -t -r wc -l
如果没有要运行的内容,该命令退出。
-n选项;修改单个命令行传递的参数个数。例如我们即使向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。
命令:file * | grep ASCII | cut -f1 -d: | xargs -t -n2 ls -ltr