1.标准输入与管道命令

管道命令就是|

Unix 命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数。

cat /etc/passwd | grep root

管道命令的作用,是将左侧命令(cat /etc/passwd)的标准输出转换为标准输入,提供给右侧命令(grep root)作为参数。

但是也有许多命令无法接收管道命令传递过来的参数echo等。

2.xargs 命令

xargs命令的作用,是将标准输入转为命令行参数。

语法:

xargs [-options] [command]

真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。

xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。

echo "one two three" | xargs mkdir

上面的代码等同于mkdir one two three

-d 参数

-d 参数可以修改分隔符

xargs将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。

echo -e "a\tb\tc" | xargs -d "\t" echo

-p 参数

参数打印出要执行的命令,询问用户是否要执行。

echo 'one two three' | xargs -p touch

-t 参数

参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。

-0 参数与 find 命令

由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。

find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。

find /path -type f -print0 | xargs -0 rm

上面命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名,也不会报错。

还有一个原因,使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报错"参数列表过长",而无法执行,改用xargs就没有这个问题,因为它对每个参数执行一次命令。

find . -name "*.txt" | xargs grep "abc"

上面命令找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc。

-n参数

-n参数指定每次将多少项,作为命令行参数。

xargs -n 1 find -name

上面命令指定将每一项(-n 1)标准输入作为命令行参数,分别执行一次命令(find -name)。

示例:

ls | xargs -n 10 rm -rf

xargs 命令