Linux:使用xargs为其他命令提供参数

来源:互联网 发布:w10安装不了软件 编辑:程序博客网 时间:2024/06/05 14:23

Linux:使用xargs为其他命令提供参数


xargs命令的作用就是从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令(xargs - build and execute command lines from standard input)。说直接一点,就是为其他命令提供参数的。多个参数时,默认的分割符是空格。如果不指定命令,则默认的命令是echo

最简单的一个例子,想用ls -l查看某个文件的属性,文件名是一个参数,这个参数可以由xargs来提供:
qingsong@db2a:/tmp$ xargs ls -l
example.txt <-手动输入文件名,回车,再Ctrl+d
-rw-rw-r-- 1 qingsong qingsong 27 Aug 24 23:04 example.txt

示例1:多行输入转化为单行输出:
qingsong@db2a:/tmp$ cat example.txt
1 2 3 4 5 6
7 8 9 10
11 12
qingsong@db2a:/tmp$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12

示例2:将单行输入转换成多行输出,-n 3表示每行最多有三个参数:
qingsong@db2a:/tmp$ cat example2.txt
1 2 3 4 5 6 7 8 9 10 11 12
qingsong@db2a:/tmp$ cat example2.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12

示例3:使用-d指定分割符:
qingsong@db2a:/tmp$ echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split

示例4:配合find命令
配合find命令,也是很厉害的,有些人(包括以前的我)喜欢在find命令找到对应的文件后,直接删除,一般如下:
find <path> <parameters> | xargs rm -rf
一般情况下,是没有问题的,但有特殊的情况,就是文件名中包含空格,这时候就会出现大问题
例如,下面的find命令找到了两个文件,其中第2个文件的文件名有空格:
qingsong@db2a:/tmp$ sudo find /tmp -name "*.data"
/tmp/file1.data
/tmp/New file2.data

使用xargs处理之后,变为下面的样子:
qingsong@db2a:/tmp$ sudo find /tmp -name "*.data" | xargs
/tmp/file1.data /tmp/New file2.data

如果使用-n 1来看每一个参数,就能看到由于空格的原因,xargs把它处理成了三个参数:
qingsong@db2a:/tmp$ sudo find /tmp -name "*.data" | xargs -n 1
/tmp/file1.data
/tmp/New
file2.data
这种情况时,如果发出 find /tmp -name "*.data" | xargs rm -f 命令,那么会尝试删除三个文件 /tmp/file1.data、/tmp/New 和 当前目录下的file2.data

可以通过下面的办法来避免:
   find /tmp -name "*.data" -print0 | xargs -0 /bin/rm -f
其中find命令的print0表示以'\0'结束文件名,即 null character,而xargs 的 "-0"参数,表示以 null character为作分割符:
qingsong@db2a:/tmp$ sudo find /tmp -name "*.data" -print0
/tmp/file1.data/tmp/New file2.dataqingsong@db2a:/tmp$

可以看到,被正确地处理为2个参数:
qingsong@db2a:/tmp$ sudo find /tmp -name "*.data" -print0 | xargs -0 -n 1
/tmp/file1.data
/tmp/New file2.data

另补充一点,find命令本身自带-delete参数,就足以实现删除功能,而且不会产生新的进程,有助于效率的提升

示例5:统计出/tmp目录下所有脚本文件(*.sh)的行数

qingsong@db2a:/tmp$ sudo find /tmp -name "*.sh" -print0 | xargs -0 wc -l

qingsong@db2a:/tmp$ sudo find /tmp -name "*.sh"  -print0 | xargs -0 wc -l   5 /tmp/variables.sh  14 /tmp/clock2.sh   6 /tmp/read.sh  18 /tmp/sleep.sh  12 /tmp/time_take.sh   7 /tmp/user.sh  11 /tmp/latch.sh   9 /tmp/inputpwd.sh  12 /tmp/clock.sh   6 /tmp/price.sh  11 /tmp/dir2/latch.sh  13 /tmp/fun.sh   7 /tmp/judge.sh   7 /tmp/printf.sh 138 total



原创粉丝点击