xargs
是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。
例如删除某个目录下的文件,可以这么做 find /path -type f -exec rm -f {} \;
如果文件过多,就可能出现 参数列表过长的错误,导致执行失败。
这个时候使用 xargs
就能比较好的解决问题 find /path -type f -print0 | xargs -0 rm。
xargs
是通过标准输入或者是管道中的一段字符串来传递命令的参数列表, 中间会有个解析的参数的过程,然后调用相应的命令并执行。
用法:
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace- str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines] [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s max- chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs] [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] [--version] [--help] [command [initial-arguments]]
参数
-0
当sdtin含有特殊字元时候,将其当成一般字符,像空格等-a file
从文件中读入作为sdtin-e flag
,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。-p
当每次执行一个argument的时候询问一次用户。-n num
后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。-t
表示先打印命令,然后再执行。-i
表示指定 {} 来接受参数-I
同-i ,但是还可以指定其它符号接收参数,如:[]-r
no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。-s num
命令行的最好字符数,指的是xargs后面那个命令的最大命令行字符数。)-L
num Use at most max-lines nonblank input lines per command line.-s是含有空格的。-l
同-L-d
delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符-x
exit的意思,主要是配合-s使用。-P
修改最大的进程数,默认是1,为0时候为as many as it can
使用实例:
实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find . -type f -print | xargs file
实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中
find / -name "core" -print | xargs echo "" >/tmp/core.log
实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
find . -perm -7 -print | xargs chmod o-w
实例4:用grep命令在所有的普通文件中搜索hostname这个词
find . -type f -print | xargs grep "hostname"
如果不加xargs就是直接搜索包含hostname这个词的文件而不是包含这个内容的文件
实例6:批量重命名
ls | xargs -t -i mv {} {}.bak
实例7:find后执行xargs提示xargs: argument line too long解决方法:
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
find . -name "file" | xargs -I [] cp [] ..
实例9:xargs的-p参数的使用
find . -name "*.log" | xargs -p -i mv {} ..
实例10:对于文件名有空格、换行符、特殊字符的,xargs 能很好的处理。
find /a -type f –print0 | xargs -0 rm
-0==–null
:输入项,是以null字符结尾的,而不是以白空格(whitespace)结尾的- 且引号和反斜杠,都不是特殊字符 –> 每个输入的字符,都视为普通字符
- 禁止掉文件结束符 –> 被视为别的参数
- 当输入项可能包含白空格,引号,反斜杠等情况时,才适合用此参数
- 使用find命令加上-print0时,所产生的输出,正好适合和此-0参数 -> 往往是用find带-print0时,加上此xargs -0,两者搭配使用
实例11:读取输入数据,重新格式化后输出
假设我们有一个文本文件,内容如下:
cat data.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
data.txt
中的文件是换行显示的。
多行输入变成单行输出
cat data.txt |xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n
控制多行输出
cat data.txt |xargs -n4
a b c d e f g h i j k l m n o p q r s t u v w x y z
-d
指定分隔符
echo 'testAtestAtestAtest'|xargs -dA
test test test test
-d
与-n
一起使用
echo 'testAtestAtestAtest'|xargs -dA -n2
test test test test
实例12:计算当前目录下文本文件中的行
file * | grep ASCII | cut -d":" -f1 | xargs wc -l