배쉬 foreach 루프


158

입력이 있습니다 (파일이라고합시다). 각 줄에는 파일 이름이 있습니다. 이 파일을 읽고 각 파일의 내용을 표시하려면 어떻게해야합니까?

답변:


234

이와 같은 일이 있습니다.

xargs cat <filenames.txt

xargs프로그램은 표준 입력을 판독하고, 입력의 각 행에 대해 실행 cat인수 (들)와 같은 입력 라인 프로그램.

루프에서 실제로이 작업을 수행하려는 경우 다음을 수행 할 수 있습니다.

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done

3
파일 이름에 공백이 있으면 둘 다 작동하지 않습니다.
mivk

@mivk 당신은 공간을 벗어날 수 있습니다
Toochka


18

while루프 는 다음과 같습니다 .

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt

이것이 최선의 방법이어야합니다. '-r'& '-d'옵션을read
sjsam

1
여기의 대부분의 다른 답변과 달리 파일 이름에 공백이있는 경우에도 실제로 작동합니다.
mivk


4

파일 이름에서 공백을 처리하고 싶을 것입니다.

그래서 처음에는 다음과 같은 것을 선택했습니다.

pax> cat qq.in
normalfile.txt
file with spaces.doc

pax> sed 's/ /\\ /g' qq.in | xargs -n 1 cat
<<contents of 'normalfile.txt'>>
<<contents of 'file with spaces.doc'>>

pax> _


0

확장자가 모두 같은 경우 (예 : .jpg) 다음을 사용할 수 있습니다.

for picture in  *.jpg ; do
    echo "the next file is $picture"
done

(이 솔루션은 파일 이름에 공백이있는 경우에도 작동합니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.