xargs
将参数作为标准输入传递给指定程序。它的一个应用场景是:一些程序无法从管道中读取输入,比如rm
、kill
等等,在需要使用管道时,可以使用xargs
命令。
下面的例子中,ls -l
命令并不会理会now.txt
,而是直接输出目录中的文件列表:
$ echo 'now.txt' | ls -l
total 2072
-rw-rw-r-- 1 tom tom 2097152 Jun 12 14:43 2M.file
drwxrwxrwx 2 tom tom 4096 May 31 16:42 a
-rwxrwxr-x 1 tom tom 10 Jun 12 14:56 a.txt
drwxrwxrwx 2 tom tom 4096 May 29 2017 bin
drwxrwxrwx 5 tom tom 4096 Jun 5 17:25 homework
drwxrwxrwx 3 tom tom 4096 May 12 10:37 name
-rwxrwxr-x 1 tom tom 14 Jun 12 12:18 now.txt
可以使用xargs
处理这个情况,用管道将echo
输出传给xargs
作为参数,xargs
将这些参数作为ls -l
的标准输入:
$ echo 'now.txt' | xargs ls -l
-rwxrwxr-x 1 tom tom 14 Jun 12 12:18 now.txt
-i
命令选项使xargs
具有插入功能,使用{}
代表参数的占位符:
$ find -maxdepth 1 -type f '!' -name '.*' | xargs -i mv {} ./backups/{}.bk
这条命令寻找当前目录中所有的普通文件,并将其移动到./backups
目录中,每个文件被添加后缀名.bk
。
使用-t
命令选项显示具体执行的命令:
$ echo "now.txt.bk" | xargs -t ls -l
ls -l now.txt.bk
-rwxrwxr-x 1 tom tom 14 Jun 12 12:18 now.txt.bk
在一些情况下,xargs
没有从管道中得到内容,但是其之后的命令还是会运行:
$ find ./ -empty
$ find ./ -empty | xargs ls -l
total 2056
-rw-rw-r-- 1 tom tom 2097152 Jun 12 14:43 2M.file.bk
-rwxrwxr-x 1 tom tom 10 Jun 12 14:56 a.txt.bk
-rwxrwxr-x 1 tom tom 14 Jun 12 12:18 now.txt.bk
使用-r
命令参数避免这种情况:
$ find ./ -empty | xargs -r ls -l
$
网友评论