xargs--标准输入转换命令行参数
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
1 | find /sbin -perm +700 |ls -l #这个命令是错误的 |
语法
xargs一般都是和其他命令连用
1 | command1 | xargs -option command2 |
参数
| 参数 | 说明 |
|---|---|
| -a,–arg-file=file | 从文件中读入作为 sdtin |
| -0,–null | 以 \ 0 作为分隔符,接受到的特殊字符将当作文本符号处理 ,用null代替空格作为分隔符,配合find命令-print()选项的输出使用 |
| -e/-E flag | flag 必须是一个以空格分隔的标志,当 xargs 分析到含有 flag 这个标志的时候就停止。 |
| -p | 每执行一个 argument 的时候询问一次用户 |
| -n num | 后面加次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的 |
| -t | 先打印命令,然后再执行 |
| -i/-I | 看 linux 支持了,将 xargs 的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。 |
| -r no-run-if-empty | 当 xargs 的输入为空的时候则停止 xargs,不用再去执行了。 |
| -l/-L num | 从标准输入一次读取 num 行送给 command 命令。 |
| -d delim | 分隔符,默认的 xargs 分隔符是回车,argument 的分隔符是空格,这里修改的是 xargs 的分隔符。 |
| -x | exit 的意思,主要是配合 - s 使用。。 |
| -P | 修改最大的进程数,默认是 1,为 0 时候为 as many as it can ,这个例子我没有想到,应该平时都用不到的吧。 |
范例
查找并显示文件详情
1 | find -name '*.txt' -print0 | xargs -0 ls -l |
查找并删除文件
1 | find -name '*.txt' -print0 | xargs -0 rm -rf |
复制所有图片文件到 /data/images
1 | ls *.jpg | xargs -n1 -I {} cp {} /data/images |
查找并压缩文件
1 | find -name "*.jpg" -print | xargs tar -czvf images.tar.gz |
指定分隔符
1 | echo "nameXnameXnameXname" | xargs -dX |
指定列数输出
1 | cat test.txt | xargs -n3 |
批量杀进程
1 | ps -ef |grep "process_name" |grep -v grep |awk '{print $2}' |xargs kill -9 |
批量拷贝文件
1 | find ./ -type f -name "*" |xargs -I {} cp {} file/ |
批量打包目录
1 | # 当前路径下所有文件/目录打包成一个tar |
批量删除文件
1 | find ./ -type f -name "tmp*" |xargs rm -rf |
批量修改文件名
1 | ls |grep ".log" |xargs -i mv {} "{}.out" |
参考
Linux xargs 命令 | 菜鸟教程 (runoob.com)
Linux命令–xargs(将命令的结果作为参数)_linux xargs_IT利刃出鞘的博客-CSDN博客
Linux命令_xargs & 批量杀进程、批量拷贝文件、组合字符串_xargs cp文件-CSDN博客


