shell常用命令—xargs命令
1. xargs命令的功能
- xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具
- xargs可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据
- xargs也可以将单行或多行文本输入转换为其他格式(例如多行变单行,单行变多行)
- xargs默认的命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代
xargs存在的意义:
它能够捕捉一个命令的输出,然后传递给另外一个命令
由于很多命令不支持|管道来传递参数,而日常工作中有这个必要,所以就有了xargs命令
例如:
2. xargs命令的使用
例1:
cat test.txt | xargs #规范文件中的内容
cat test.txt | xargs -n3 #-n4指定每行3个字符
例2:
echo "nameXnameXnameXname" | xargs -dX #删除字符D
echo "nameXnameXnameXname" | xargs -dX -n2 #指定每行2个字符
例3:
echo "one two three"
echo "one two three" | mkdir
echo "one two three" | xargs mkdir
ls
例4:
echo "one two three" | xargs -p touch #-p询问是否执行指定动作
touch one two three four ?... #不输入yes就不会执行
ls
test.txt
echo "one two three" | xargs -p touch
touch one two three four ?...yes #输入yes才会执行
ls
one test.txt three two
echo "one two three" | xargs -t rm #-t不询问 直接执行指定动作
rm one two three
ls
test.txt
例5:
xargs默认将空格作为分隔符,不太适合处理文件名(因为文件名可能包含空格)。
find命令有一个特别的参数 -print0,find -print0表示在find的每一个结果之后加一个NULL字符,而不是默认加一个换行符。find的默认在每一个结果后加一个’\n’,所以输出结果是一行一行的。当使用了-print0之后,就变成一行了。
然后xargs -0表示xargs用NULL来作为分隔符。这样前后搭配就不会出现空格和换行符的错误了。选择NULL做分隔符,是因为一般编程语言把NULL作为字符串结束的标志,所以文件名不可能以NULL结尾,这样确保万无一失。
find /etc/ -type f -print0 | xargs -0 ls
例6:
如果xargs要将命令行参数传递给多个命令,就要使用 -I 参数
sh -c "echo file;mkdir file"
ls
rm -fr file
vim foo.txt
cat foo.txt | xargs -I name sh -c 'echo name;mkdir name' #如果xargs要将命令行参数传递给多个命令,就要使用 -I 参数
ls