xargs note

作用

xargs,是execute arguments的缩写,它的作用是从标准输入中读取内容,并将
此内容传递给它要协助的命令,并作为那个命令的参数来执行。

与管道的区别

  • 管道可以实现:将前面的标准输出作为后面的 标准输入
  • 管道无法实现:将前面的标准输出作为后面的 命令参数
1
2
3
4
5
6
7
$ cat /etc/passwd | grep root
# grep命令可以接受标准输入作为参数

大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数

echo "one two three" | xargs mkdir
# mkdir one two three

分隔符

  • xargs会将前一个命令的标准输出转换成命令参数,但很多人可能不知道的是,xargs的标准输入中出现的“换行符、空格、制表符”都将被空格取代

  • xargs默认的分隔符是空格

  • 还可以使用-d选项来指定任何一个符号作为分隔符

find and xargs

1
find . -name '*.log' -print0 | xargs -0 rm -f

xargs提供了-0选项,允许将NULL作为分隔符,而find命令也心有灵犀地提供了对应的选项来产生以NULL字符作为分隔符的输出。

find命令提供的对应方法是-print0选项,在文件名之后输出NULL,而不像-print选项那样输出换行符(换行符会被xargs替换成空格)。

xargs的-0选项不仅可以将分隔符从默认的空格变成NULL,还会将单引号、双引号、反斜线等统统默认为是普通字符。所以说,-0选项特别适合处理命令参数中含有引号、空格、反斜线的情况.

other options

  • p 参数打印出要执行的命令,询问用户是否要执行
  • I 要将命令行参数传给多个命令
1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat foo.txt
one
two
three

# -I file表示file是命令行参数的替代字符串
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three

$ ls
one two three
-->