xargs命令
xargs命令可以通过管道或者stdin接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数。
xargs 与管道有什么不同
(base) [root@localhost Tana]# echo "--help"| cat --help
(base) [root@localhost Tana]# echo "--help"| xargs cat Usage: cat [OPTION]... [FILE]... Concatenate FILE(s), or standard input, to standard output. -A, --show-all equivalent to -vET -b, --number-nonblank number nonempty output lines, overrides -n -e equivalent to -vE -E, --show-ends display $ at end of each line -n, --number number all output lines -s, --squeeze-blank suppress repeated empty output lines -t equivalent to -vT -T, --show-tabs display TAB characters as ^I -u (ignored) -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
从这两个列子可以看到 ,管道只是把 标准输入给下一个命令当做内容,而 ,xargs是把echo 的内容 当做下一个命令的 命令参数
xargs 选项
-d 选项 (指定分隔符)
默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符,例
echo "nameXnameXnameXname" | xargs -dX name name name name
-n 选项( max-args)
选项表示将xargs生成的命令行参数,每次传递几个参数给其后面的命令执行,例如如果xargs从标准输入中读入内容,然后以分隔符分割之后生成的命令行参数有10个,使用 -n 3 之后表示一次传递给xargs后面的命令是3个参数,因为一共有10个参数,所以要执行4次,才能将参数用完。
(base) [root@localhost Tana]# echo '11@22@33@44@55@66@77@88@99@00' | xargs -d '@' -n 3 echo 11 22 33 44 55 66 77 88 99 00
-p 选项 (interactive)
使用该选项之后xargs并不会马上执行其后面的命令,而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数),询问是否执行,输入 y 才继续执行,否则不执行。这种方式可以清楚的看到执行的命令是什么样子,也就是xargs传递给命令的参数是什么,例如:
(base) [root@localhost Tana]# echo '11@22@33' | xargs -p -d '@' echo echo 11 22 33 ?...y 11 22 33
-E 选项 (eof-str)
该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令
(base) [root@localhost Tana]# echo '11 22 33' | xargs -E '33' echo 11 22
xargs -0 用NULL来作为分隔符,通常与 find 搭配
find -print0表示在find的每一个结果之后加一个NULL字符
find . -type f -name "*.sh" -print0 | xargs -0 rm -f
-I 选项 (replace-str)
使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每一个参数命令都会被执行一次
#复制所有图片文件到 /data/images 目录下: ls *.jpg | xargs -n1 -I cp {} /data/images