【问题标题】:bash read lines of data in multiple files exclude subdirectoriesbash读取多个文件中的数据行排除子目录
【发布时间】:2015-03-18 07:03:16
【问题描述】:

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

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

我注意到如果我从中读取行的目录有子目录,它会尝试读取子目录并且脚本退出并出现以下错误:

read: read error: 0: Is a directory

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

`

【问题讨论】:

  • 你的find . -type f 中的文件,仅获取常规文件
  • 第一:我想你错过了in关键字for file in /tmp/path/*。第二:@SameerNaik 回答的相同
  • @SameerNaik 明白了,谢谢!我在内循环之外使用了条件语句。这消除了子目录。

标签: bash loops while-loop readline subdirectory


【解决方案1】:

您可以在每次循环迭代中使用 Bash 条件来测试文件是目录还是“常规”文件,但这会给您留下另一个迫在眉睫的问题:如果有很多文件怎么办?如果/tmp/path/* 扩展为很多(或一些非常长的)文件名,您将遇到问题,因为存在最大命令行长度限制。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多