如何在xargs中用-I{}替换参数并适配多输入?解决-n与-I冲突
用xargs的-I{}实现批量并行处理并追加内容的方案
当xargs的-I{}参数与-n/-P冲突时(-I会强制按单个项处理,忽略-n设置),可以通过内联Shell脚本绕开限制,同时实现批量、并行处理,以及在输入项后追加内容的需求。
具体命令示例
针对你提到的cp场景,修改后的命令如下:
find ./testsrc -type f -print0 | xargs -0 -P4 -n10 bash -c 'for file in "$@"; do cp --parents "$file" <dest>/; done' _
关键细节解释
-n10:让xargs每次将10个文件路径作为一批,传递给后续的Shell脚本-P4:同时启动4个独立的Shell进程,并行处理这些批次- 内联脚本部分:
bash -c '...':启动新的bash进程执行指定脚本for file in "$@":遍历xargs传入的所有文件路径("$@"会保留每个路径的原始格式,包括空格、特殊字符)cp --parents "$file" <dest>/:对每个文件执行目标命令,$file等价于原-I{}中的占位符,将文件路径放到指定位置- 最后的
_:作为bash脚本的$0参数(脚本名称占位,不影响后续的文件参数)
通用适配方法
如果是其他不支持-t选项的命令,只需修改内联脚本中的执行逻辑:
find ./testsrc -type f -print0 | xargs -0 -P4 -n10 bash -c 'for item in "$@"; do 你的命令 "$item" 追加内容; done' _
将你的命令 "$item" 追加内容替换为实际命令结构,$item对应原-I{}的占位位置。
注意事项
- 必须配合
find -print0和xargs -0使用,确保含特殊字符的文件名能被正确处理 - 如果目标命令本身支持批量处理多个参数,可去掉循环,直接将
"$@"传入命令对应位置以提升效率
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

