You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用xargs向脚本传递含前缀修改的多文件参数?

解决xargs配合sed替换失效的问题

你的命令失效的核心原因是:$(echo {} | sed 's/analysis/analysis_q/g') 是在xargs启动前就被shell解析执行了,此时{}还只是个固定字符串,不是实际的文件名,所以sed处理的是{}而非目标文件名,导致所有run_this调用都用了错误的参数。

给你几个可行的解决办法:

方法1:用bash循环(最可靠,推荐)

直接用bash内置的参数替换功能,不用额外启动sed进程,还能避免文件名含特殊字符的问题:

for file in analysis-{A,B,C}*-[123][abc].csv; do
    run_this "${file/analysis/analysis_q}" "$file"
done

${file/analysis/analysis_q}会把$file里第一个analysis替换成analysis_q,如果要替换所有出现的analysis,可以改成${file//analysis/analysis_q}。

方法2:调整xargs的写法(用子shell执行替换)

如果一定要用xargs,得把替换逻辑放到子shell里,让每个文件名传入后再执行替换:

ls analysis-{A,B,C}*-[123][abc].csv | xargs -I {} bash -c 'run_this "${0/analysis/analysis_q}" "$0"' {}

要是坚持用sed实现替换,也可以这么写:

ls analysis-{A,B,C}*-[123][abc].csv | xargs -I {} bash -c 'q_file=$(echo "$0" | sed "s/analysis/analysis_q/g"); run_this "$q_file" "$0"' {}

注意:尽量避免用ls传递文件名,如果文件名包含空格、换行或特殊字符,ls的输出会出现解析错误,方法1里直接用glob遍历文件是更安全的做法。

内容的提问来源于stack exchange,提问作者atapaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:49:59