Linux中的xargs

xargs将参数作为标准输入传递给指定程序。它的一个应用场景是:一些程序无法从管道中读取输入,比如rmkill等等,在需要使用管道时,可以使用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
$

你可能感兴趣的:(Linux中的xargs)