xargs 命令
xargs
可以读入 stdin 的数据,并且以空格符或断行字符作为分辨,将 stdin
的数据分隔成为 arguments
。
xargs
命令的作用,是将标准输入转为命令行参数。
$ echo "hello world" | xargs echo
hello world
上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。
xargs命令的格式如下。
$ xargs [-options] [command]
真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。
xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
$ echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。
一、-L 参数
使用-L参数,指定每行作为一个命令行参数。
$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md
上面命令指定了每一行(-L 1)作为命令行参数,分别运行一次命令(find -name)。
二、-n 参数
-L参数虽然解决了多行的问题,但是有时用户会在同一行输入多项。
-n参数指定每次将多少项,作为命令行参数。
$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9
三、-I参数
如果xargs要将命令行参数传给多个命令,可以使用-I
参数。-I
指定每一项命令行参数的替代字符串。
$ cat foo.txt
one
two
three
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three
$ ls
one two three
四、其他参数
-p
:参数打印出要执行的命令,询问用户是否要执行
-t
:参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认
例子
找到定时任务的脚本,并将它拷贝到 ./tmp/xianyu 目录
crontab -l | egrep -v "cd|python" | awk '{print $6}' | xargs -L 1 -I file sh -c 'cp file ./tmp/xianyu/'