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

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

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

관련 정보