web-dev-qa-db-ja.com

Bash foreachループ

入力があります(ファイルとしましょう)。各行にファイル名があります。このファイルを読み、それぞれの内容を表示するにはどうすればよいですか。

144
danidacar

このような何かがするでしょう:

xargs cat <filenames.txt

xargsプログラムはその標準入力を読み取り、入力の各行に対して、入力行を引数としてcatプログラムを実行します。

あなたが本当にこれをループでやりたいなら、あなたはできる:

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

"foreach"はbashの名前ではありません。それは単に "for"です。次のようにして1行で処理できます。

for fn in `cat filenames.txt`; do cat "$fn"; done

参照: http://www.cyberciti.biz/faq/linux-unix-bash-for-loop-one-line-command/

40
Tom K. C. Chiu

これがwhileループです。

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
17
dogbane
xargs --arg-file inputfile cat

これはファイル名に続いてファイルの内容を出力します。

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
5

あなたはおそらくあなたのファイル名の中のスペースを処理したいと思うでしょう。

だから私は最初のようなものを選ぶだろう:

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> _
4
paxdiablo
cat `cat filenames.txt`

トリックをします

3
Alan Dyke