![파일 이름의 일부를 stdin의 입력으로 바꾸는 방법은 무엇입니까?](https://rvso.com/image/178489/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A5%BC%20stdin%EC%9D%98%20%EC%9E%85%EB%A0%A5%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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