linux 将文件名传递给脚本,该脚本接受多个参数,这些参数是使用xargs修改的输入文件的名称

ldxq2e6h  于 2023-04-20  发布在  Linux
关注(0)|答案(3)|浏览(119)

我有一个脚本,接受两个文件作为参数(run_this file1 file2)。我有一堆文件,我选择与

ls analysis-{A,B,C}*-[123][abc].csv

对于每一个,我还需要传递对应的文件,它的名字只在前缀上有所不同:而不是analysis,它以analysis_q开始。我尝试了许多我知道的选项,但sed似乎拒绝与xargs合作(我不知道其他简单的方法)
我试过的一件事是:

ls analysis-{A,B,C}*-[123][abc].csv | xargs --interactive -I '{}' run_this `$(echo {} | sed 's/analysis/analysis_q/g')` {}

我希望制作

run_this analysis_q-A-1a.csv analysis-A-1a.csv
run_this analysis_q-A-1b.csv analysis-A-1b.csv

等等。

cl25kdpy

cl25kdpy1#

只是一个普通的循环。

for f1 in analysis-{A,B,C}*-[123][abc].csv; do
    f2=$(sed 's/analysis/analysis_q/g' <<<"$f1")
    run_this "$f1" "$f2"
done

对于xargs,我会删除前缀,只使用变量部分。

printf "%s\n" analysis-{A,B,C}*-[123][abc].csv |
sed 's/^analysis-//' |
xargs --interactive -I {} run_this analysis-{} analysis_q-{}
shyt4zoc

shyt4zoc2#

像这样,使用sedxargs

printf '%s\n' analysis-*.csv |
    sed -E 's/^(analysis)(.*)/\1_q\2 \1\2/' |
    xargs -n2 echo run_this

当您对输出满意时,删除echo

输出
run_this analysis_q-A-1a.csv analysis-A-1a.csv
run_this analysis_q-A-1b.csv analysis-A-1b.csv
33qvvth1

33qvvth13#

Bash可以很好地对变量进行搜索和替换,它被称为 * 变量扩展 * 或 * 变量替换 *:

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

一旦这对你有效,删除echo,脚本将运行。表达式${f/analysis/analysis_q}采用$f的值,用 analysis_q 替换 analysis
这个方法根本不使用lssedxargs。它是纯bash。

相关问题