xargs - 从标准输入构造命令参数
xargs 读取标准输入中的项目,把它们追加到指定命令的参数列表,并按系统命令行长度限制分批执行。
常用参数
-0、--null:使用 NUL 字节分隔输入,适合文件名。-r、--no-run-if-empty:没有输入时不执行命令,这是 GNU 扩展。-n N、--max-args=N:每次最多使用 N 个输入参数。-I REPLACE:逐行读取,并用占位符替换命令中的位置。-t、--verbose:执行前显示命令。-p、--interactive:执行前询问。-P N、--max-procs=N:最多并行运行 N 个进程。
基本示例
# 每次处理一个项目
printf '%s\n' alpha beta gamma | xargs -n 1 printf 'item=%s\n'
# 使用占位符
printf '%s\n' alpha beta | xargs -I {} printf '[%s]\n' '{}'
# 每次执行前显示命令并询问
printf '%s\n' alpha beta | xargs -n 1 -t -p printf '%s\n'安全处理文件名
默认的空白分隔不能可靠处理含空格、引号、反斜杠或换行的文件名。与 find 配合时,应使用 NUL 分隔:
find . -type f -name '*.log' -print0 |
xargs -0 -r wc -l --如果工具支持 find -exec ... {} +,也可直接避免中间的文本路径列表:
find . -type f -name '*.log' -exec wc -l -- {} +并行执行
printf '%s\0' task-1 task-2 task-3 |
xargs -0 -r -n 1 -P 2 process-task并行任务的输出顺序不固定。会修改共享文件、数据库或远程状态的命令,只有在确认并发安全后才能使用 -P。
安全提示
- 不要使用
ls | xargs rm:文件名边界不可靠,筛选结果也容易超出预期。 - 破坏性操作前先把最终参数输出并核对,不要用
rm -rf作为教学示例。 - GNU
xargs默认可能在空输入时仍执行一次命令;需要避免时使用-r,并注意它不是所有系统都支持。 - 不可信输入可能被当作以
-开头的命令参数。目标命令支持时,在固定参数末尾添加--。 -P 0允许尽可能多的并发进程,可能耗尽资源,不应在未设上限时使用。