使用Linux xargs 给其他命令传递参数

1,436 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

我们都知道,在Linux中,管道|命令可以实现将左侧命令的标准输出转换为标准输入提供给右侧命令使用,但是有些命令不接受管道的传递方式,例如lsecho等,其实有很多命令都不支持标准输入作为参数,只能在执行命令行时指定参数,这就导致不能使用管道|命令传递参数。而xargs命令的功能就是将标准输入进行处理,然后转化为命令行参数。

语法格式

command | xargs [options] command

常用参数如下:

  • -a file:从文件中读入作为标准输入stdin
  • -d:默认情况下,xargs将换行符和空格作为分隔符,-d可以更改分隔符
  • -p:打印要执行的命令,询问用户是否要执行
  • -t:打印要执行的命令,然后直接执行,不需要用户确认
  • -L 行数:标准输入包含多行时,-L参数指定多少行作为一个命令行参数
  • -n 数量:指定每次将多少项,作为命令行参数
  • --max-procs:同时用多少个进程并行执行命令,-max-procs 0表示不限制进程数

使用实例

上面说到,有很多命令都不支持标准输入作为参数,导致不能使用管道|命令传递参数,但是,xargs和管道一起使用时,就可以了。

例如:

find 命令接受管道传递参数
find | grep test
# cat 命令不接受管道传递参数
cat test.txt
# hello xargs!
echo "test.txt" | cat
# test.txt
[root@centos7 test]#
# xargs 将标准输入转为命令行参数
echo "test.txt" | xargs cat
# hello xargs!

可以看到,cat命令不接受管道传递参数,我们尝试通过标准输入把参数传给cat, 结果只是显示了文件名 ,xargsecho的输出作为标准输入传递给了右侧的cat命令,作为命令的参数执行。

使用-d参数指定制表符\t作为分隔符:

echo -e "a\tb\tc" | xargs -d "\t" echo
# a b c

使用-p参数打印要执行的命令,询问是否要执行:

find ./ | xargs -p rm -f
rm -f ./ ./test_ae ./test_ac ./test_am ?...

原创不易,如果小伙伴们觉得有帮助,麻烦点个赞再走呗~

最后,感谢女朋友在工作和生活中的包容、理解与支持 !