一般用到此命令是在find 语句中,不仅于此。
cat example.txt # 样例文件
1 2 3 4 5 6
7 8 9 10
11 12
$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12
echo “splitXsplitXsplitXsplit” | xargs -d X
split split split split
echo “splitXsplitXsplitXsplit” | xargs -d X -n 2
split split
split split
catargs.txtarg1arg2arg3就第一个问题,我们可以将这个命令执行多次,每次使用一个参数: cat args.txt | xargs -n 1 ./cecho.sh
arg1 #
arg2 #
arg3 #
$ cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2 #
arg3 #
$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3 #
$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #
-I {} 指定了替换字符串。对于每一个命令参数,字符串 {} 都会被从 stdin 读取到的参数替
换掉。
find.−typef−name“∗.txt”−print|xargsrm−f这样做很危险。有时可能会删除不必要删除的文件。我们没法预测分隔find命令输出结果的定界符究竟是什么(‘\n′或者′′)。很多文件名中都可能会包含空格符(′′),因此xargs很可能会误认为它们是定界符(例如,helltext.txt会被xargs误解为hell和text.txt)。只要我们把find的输出作为xargs的输入,就必须将−print0与find结合使用,以字符null(‘\0′)来分隔输出。用find匹配并列出所有的.txt文件,然后用xargs将这些文件删除: find . -type f -name “*.txt” -print0 | xargs -0 rm -f
这样就可以删除所有的.txt文件。 xargs -0 将\ 0 作为输入定界符。
cat files.txt | ( while read arg; do cat $arg; done )
等同于cat files.txt | xargs -I {} cat {}