Bash
如何用標準輸入的輸入替換文件名的一部分?
假設我有一個
ids.txt
包含多個條目的文件,例如foo bar bam ...
例如。我想用它作為輸入在一些文件上執行命令,這些文件包含文件名中的 id,比如
foo_1.gz
,foo_2.gz
,bar_1.gz
,bar_2.gz
, … 等等。
{}
當我看到它與另一個命令一起工作時,我嘗試引用輸入,如下所示:cat ids.txt | xargs my.command --input1 {}_1.gz --input2 {}_2.gz
但它總是給我這個錯誤:
{}_1.gz no such file or directory
有沒有辦法將輸入
cat
視為字元串並自動將它們插入到輸入文件名中my.command
?問題還在於
my.command
每次都需要兩個輸入文件,所以我不能只使用帶有真實文件名的列表而不是ids.txt
.
您需要在
-I
此處使用該選項:$ cat ids.txt | xargs -I{} echo my.command --input1 {}_1.gz --input2 {}_2.gz my.command --input1 foo_1.gz --input2 foo_2.gz my.command --input1 bar_1.gz --input2 bar_2.gz my.command --input1 bam_1.gz --input2 bam_2.gz
或者,使用 shell 循環:
while read id; do my.command --input1 "${id}"_1.gz --input2 "${id}"_2.gz done < ids.txt
這是假設您的 ID 沒有空格或反斜杠。如果他們可能,請改用它:
while IFS= read -r id; do my.command --input1 "${id}"_1.gz --input2 "${id}"_2.gz done < ids.txt
最後,您還可以使用每行包含兩個文件名的列表:
$ cat ids.txt foo_1.gz foo_2.gz bar_1.gz bar_2.gz bam_1.gz bam_2.gz
現在:
while read file1 file2; do my.command --input1 "$file1" --input2 "$file2" done < ids.txt