xargs
最近我从svn上checkout出来了一个文件夹,然后加入了git的跟踪目录.用过svn的同学可能知道,这个文件夹里面每一层级都有个.svn隐藏文件夹,需要删除他们.本来我准备笨拙地一个一个手动删除的,一位同事在我面前敲了大概是$find . -type d -name "*.svn" | xargs rm -rf
这样的命令,顿时觉得很高端大气上档次.刚好新学了Markdown,就顺便整理下xargs的用法,练练手.主要的参考来自于伟大的$man xargs
.
1.概述
xargs
从标准输入(stdin)中读取数据进行处理
- 数据以空格进行分隔
- 可以根据参数进行一次或多次处理,默认的处理命令是
/bin/echo
- 空行不进行处理,会被忽略
- 遇到命令状态为255时,xargs会立刻停止,譬如发生错误时.
下面我们来看看xargs
有哪些参数可以选择.
2.options
-
-a file
: 从file中读入数据$cat 1.txt aaa bbb ccc ddd a b $xargs -a 1.txt aaa bbb ccc ddd a b
-
-0
: 当输入有特殊字符时,将其当作一般字符处理,比如""和空格$echo "// " | xargs // $echo "// " | xargs -0 //
-
-d
: 指定分隔符$cat 1.txt aaa bbb ccc ddd a b $cat 1.txt | xargs -d 'c' aaa bbb ddd a b
-
-E eof-str
: 指定结束标志为eof-str
,xargs
处理到这个标志就会停止$xargs -E 'ddd' -a 1.txt aaa bbb ccc $xargs -E 'dd' -a 1.txt aaa bbb ccc ddd a b $cat 1.txt | xargs -E 'ddd' aaa bbb ccc
-
-I replace-str
: 将每行输入输入内容替换为replace-str
$cat 1.txt aaa bbb ccc ddd a b $cat 1.txt | xargs -t -I {} echo {} >> 1.txt echo aaa bbb ccc ddd echo a b $cat 1.txt aaa bbb ccc ddd a b aaa bbb ccc ddd a b
-
-i
: 等同于-I{}
$cat 1.txt aaa bbb ccc ddd a b $cat 1.txt | xargs -t -i echo {} >> 1.txt echo aaa bbb ccc ddd echo a b $cat 1.txt aaa bbb ccc ddd a b aaa bbb ccc ddd a b
-
-L max-lines
: 每次读取max-line
行输入交由xargs
处理$cat 1.txt aaa bbb ccc ddd a b $cat 1.txt |xargs -L 2 aaa bbb ccc ddd a b $cat 1.txt |xargs -L 1 aaa bbb ccc ddd a b
-
-l
: 类似于-L
,区别在于-l
可以不指定参数,默认为1. -
-n max-args
: 每行执行max-args
个输入,默认执行所有$cat 1.txt | xargs -n 2 aaa bbb ccc ddd a b
-
-p
: 交互模式,执行前询问是否执行$cat 1.txt | xargs -p /bin/echo aaa bbb ccc ddd a b ?...y aaa bbb ccc ddd a b $cat 1.txt | xargs -p /bin/echo aaa bbb ccc ddd a b ?...n
-
-r
: 无输入则停止执行,默认至少执行1次$ echo ""|xargs -t mv mv mv: missing file operand Try `mv --help` for more information. $ echo ""|xargs -t -r mv #直接退出
-
-s max-chars
:xargs
每次执行命令的最大长度(含空格)$ cat 1.txt aaa bbb ccc ddd a b $ cat 1.txt |xargs -t -s 30 /bin/echo aaa bbb ccc ddd a b aaa bbb ccc ddd a b #length(/bin/echo aaa bbb ccc ddd a b )=30 $cat 1.txt |xargs -t -s 14 /bin/echo aaa aaa /bin/echo bbb bbb /bin/echo ccc ccc /bin/echo ddd ddd /bin/echo a b a b #length(/bin/echo aaa )=14
-
-t
: 先打印执行的命令,然后执行$cat 1.txt | xargs -t /bin/echo aaa bbb ccc ddd a b aaa bbb ccc ddd a b
-
-x
: 当xargs
执行的命令长度大于-s max-char
时,停止执行 -
-P max-procs
: 修改线程数,默认为单线程.max-procs
为0时,as many processes as possible