【问题标题】:Iterate over files in directory using bash script使用 bash 脚本遍历目录中的文件
【发布时间】:2014-02-22 12:44:55
【问题描述】:

我想遍历给定目录中的文件。我尝试使用 for 循环来做同样的事情......但我在这个循环中有另一个循环,我需要读取多个文件,直到该循环内的条件为真才能一次上传......但我是内部循环只能访问一个文件,因为文件迭代器循环位于内部循环之外。 有没有像 file.getNext 这样的东西,这样我就可以在不使用索引/循环的情况下访问循环内的文件数。

我需要这样的东西:

while [ count -le $uploadRate ]
do
   files="$files,directory.getNextFile"
   $(curl -o $log_Path -T "{$files}" url)
done

$files 将同时上传多个文件 我不想将文件加载到数组中,因为目录有大量文件,所以数组不是可行的选择,所以想像 getNext 文件一样遍历目录。

【问题讨论】:

  • 我不明白这个问题。你的内循环在哪里?另外,为什么$(...)里面有curl,右括号在哪里?
  • 上面的while循环是内循环,我想在那个循环内一次读取5个文件。

标签: bash


【解决方案1】:

你可以像这样保持你的外循环来读取目录/somedir/中的所有文件/目录:

filesToBeRead=5
chunkFiles=()
for f in /somedir/*; do
    chunkFiles+=( "$f" )
    if [[ ${#chunkFiles[@]} -eq 5 ]]; then
        processChunkFiles( "${chunkFiles[@]}" )
        chunkFiles=()
    fi
done
processChunkFiles( "${chunkFiles[@]}" )

PS:你需要写一个processChunkFiles函数来处理/处理5个文件。

【讨论】:

  • 但是要读取文件,我想应用另一个条件,例如一次读取 5 个文件.. 那么我应该怎么做.. 我想要这样 if(filesToBeRead == 5) #then read前 5 个文件并做一些操作
  • 谢谢!这很有帮助。
  • 嘿,我遇到了一些问题。因为我们使用“for f in /somedir/*;”它本身就像数组一样工作,因为它加载 f 中的所有文件。因此,如果我将文件保存在数千个中。处理时间变慢了..您能否提出任何可行的解决方案,以便 f 对象不必担心该目录下存在的文件数量。
【解决方案2】:

将文件名放在一个数组中,并以 5 个为一组进行迭代:

files=(/path/to/dir/*)
nfiles=${#files[@]}
for ((i = 0; i < nfiles; i += 5)); do
    for ((j = i; j < nfiles; j++)); do
        # Do something with ${files[$j]}
    done
done

【讨论】:

  • 感谢您的回复。实际上我不想使用数组,因为我有数百万个文件要读取,而且我认为将文件读入数组不是可行的解决方案,因为数组大小会很大,如果您不这么认为,请告诉我。如果我们还有其他选择。
猜你喜欢
  • 2011-05-11
  • 2017-09-29
  • 1970-01-01
  • 2010-11-09
  • 2017-08-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多