Bash foreach循环


158

我有输入(比如说一个文件)。每行上都有一个文件名。如何读取此文件并显示每个文件的内容。

Answers:


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,2016年

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

(如果文件名包含空格,此解决方案也适用)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.