파일 이름의 일부를 stdin의 입력으로 바꾸는 방법은 무엇입니까?

파일 이름의 일부를 stdin의 입력으로 바꾸는 방법은 무엇입니까?

ids.txt다음과 같은 여러 항목이 포함된 파일이 있다고 가정해 보겠습니다 .

foo
bar
bam
...

예를 들어. foo_1.gz, foo_2.gz, bar_1.gz, bar_2.gz... 등과 같은 파일 이름에 ID가 포함된 일부 파일에 대해 명령을 실행하기 위해 이것을 입력으로 사용하고 싶습니다 .

{}다음과 같이 다른 명령과 함께 작동하는 것을 보고 입력을 참조하려고 했습니다 .

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.

답변1

여기에서 옵션 을 사용해야 합니다 -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

또는 쉘 루프를 사용하십시오.

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

관련 정보