如何用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
相关产品推荐
相关产品推荐

