Bash 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 2018年

@mivkスペースから脱出できます
Toochka


18

ここにwhileループがあります:

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

これが最善のアプローチです。「-r」&「-d」オプションを使用するとあなたread
sjsam

1
ここでの他のほとんどの回答とは異なり、ファイル名にスペースが含まれている場合でも、これは実際に機能します。
mivk 2018年


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.