xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

之所以能用到这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:

1
2
find /sbin -perm +700 |ls -l       #这个命令是错误的
find /sbin -perm +700 |xargs 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
2
3
4
find -name '*.txt' -print0 | xargs -0 ls -l
# `xargs`命令用于将输入作为参数传递给另一个命令。在这个命令中,`xargs -0 ls -l`接收`find`命令输出的文件名,并将它们作为参数传递给`ls -l`命令,以获取这些文件的详细列表。

# `-0`是`xargs`命令的选项,用于告诉`xargs`使用与`find`命令相同的空字符作为参数之间的分隔符。这样可以确保`ls -l`命令正确地处理包含特殊字符或空格的文件名。

查找并删除文件

1
find -name '*.txt' -print0 | xargs -0 rm -rf

复制所有图片文件到 /data/images

1
2
3
ls *.jpg | xargs -n1 -I {} cp {} /data/images
# `-n1` 表示每次传递一个参数给 `cp` 命令,即每次只复制一个文件。
# `-I {}` 指定一个占位符 `{}`,用于表示传递给 `cp` 命令的参数。

查找并压缩文件

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
2
find ./ -type f -name "*" |xargs -I {} cp {} file/
find ./ -type f -name "*" |xargs -i cp {} ./

批量打包目录

1
2
3
4
5
6
7
8
# 当前路径下所有文件/目录打包成一个tar
ls ./ |xargs tar -cvf dir.tar

# 指定目录/文件打包成一个tar
echo "dir1 dir3" |xargs tar -cvf dir.tar

# 将当前所有文件打包成一个tar
find ./ -type f -name "*" |xargs tar -cvf file.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博客