bash读取多个文件中的数据行不包括子目录

时间:2015-01-20 06:08:55

标签: bash loops while-loop readline subdirectory

我使用下面的代码来解析文件的目录并从每个文件中读取每一行:

for file in /tmp/path/*; do
    while read line; do
    [Doing some stuff...]
    done < "$file"
done

我注意到我正在读取的目录是否包含子目录,它会尝试读取子目录并且脚本退出时出现以下错误:

read: read error: 0: Is a directory

我不确定在从目录中的多个文件中读取行时如何排除子目录。任何帮助表示赞赏...

`

1 个答案:

答案 0 :(得分:1)

您可以使用Bash条件来测试文件是目录还是&#34;常规&#34;在每次循环迭代中都有文件,但这会让你遇到另一个问题:如果有很多文件怎么办?如果/tmp/path/*扩展为大量(或几个很长的)文件名,则会出现问题,因为存在最大命令行长度限制。

更好的方法是使用find。像这样:

find /tmp/path -depth 1 -type f | while read file; do
   # ...

这样你就永远不会达到命令行长度限制(因为你永远不会在shell中扩展),尽管如果你的文件名中包含换行符,你仍然会遇到问题(恐怖!)。如果您的文件名可能包含换行符,则可以尝试find -print0