xargs的核心作用是将标准输入转换为命令行参数,解决命令不支持管道传参的问题;它可处理含空格文件名(配合-print0/-0)、控制参数数量(-n)、逐个执行(-I)及安全防护(-t/-r)。

xargs 的核心作用就是把标准输入(比如管道过来的文本)变成命令能直接用的参数,解决很多命令不支持管道传参的问题。
基本用法:让命令“吃”进管道数据
多数命令(如 rm、mkdir、cp)只认命令行参数,不认标准输入。xargs 就是中间翻译官:
- echo "file1 file2" | xargs rm → 相当于执行 rm file1 file2
- find . -name "*.log" | xargs gzip → 把所有 .log 文件路径一次性传给 gzip 压缩
- 不加 xargs 直接写 find . -name "*.log" | gzip 是无效的,因为 gzip 不从 stdin 读文件名
处理含空格或特殊字符的文件名
默认按空格/换行切分,遇到带空格的文件名会出错。安全做法是配合 -0 和 find -print0:
- find . -name "*.txt" -print0 | xargs -0 rm → 用 \0 分隔,避免空格、换行、制表符导致误切
- ls | xargs -d '\n' echo → 显式指定换行符为分隔符,比默认更可控
控制参数数量和执行方式
批量操作时,常需限制每次传多少个参数,或逐个执行:
- ls *.txt | xargs -n 3 cat → 每次最多传 3 个文件给 cat,分批执行
- ls *.conf | xargs -I {} cp {} backup/ → 每个文件单独执行一次 cp,{} 是占位符,会被替换成当前文件名
- find . -type f -name "*.tmp" | xargs -t -r rm → -t 先打印要执行的命令,-r 防止输入为空时误删整个目录
常见搭配场景
实际中它几乎总和 find、grep、ls 这类输出列表的命令一起用:
- 删大量小文件:find /tmp -name "*.tmp" -mtime +7 | xargs rm
- 批量重命名:ls *.old | xargs -I {} mv {} {}.bak
- 查多个文件里的关键词:find . -name "*.c" | xargs grep "malloc"


















