我需要迭代 120k 到 500k 个文件。find
处理得很好。
find $PWD -type f -path "fragments/*.pdbqt"
由于某种原因,我想以相同的顺序再次列出同一组文件。我不介意列表是按字母数字排序还是按fstat
调用排序或其他方式排序。使用sort
不是一个选项,因为它需要find
在继续之前知道完整的输出,从而减慢脚本执行速度。你知道有什么方法可以做到这一点吗?
更新。 我不好地描述了我的问题。当我的脚本处理如此大量的文件时,可能会发生轻微中断,并且 UPS 可能会停机。我的脚本应该从中断处继续。如何处理剩余的文件?
答案1
将查找输出保存到文件中,并让您的脚本使用该文件作为要处理的文件列表。当脚本完成文件的处理时,让它将文件名写入另一个文件。如果脚本被中断,grep
当脚本重新启动时,排除已处理的文件将是一件简单的事情,例如使用。例子:
touch files_already_processed
while IFS= read -r file
do
# skip file if already processed
grep -q -e "$file" files_already_processed && continue
# process the file
# processing code goes here
echo "$file" >> files_already_processed
done <files_to_process
答案2
该find
命令按目录顺序返回文件。目录顺序不稳定;在某些文件系统中,如果添加或删除文件,可能会影响同一目录中其他文件的顺序。
我质疑你关于排序不是一种选择的说法。除非您对每个文件的处理速度非常快,否则构建文件列表的速度相当快。将其保存到文件中,以便在作业中断时可以重复使用。
无论如何,您都需要知道您从哪里停止,并从那里继续。从已经生成的文件列表中恢复比在中间恢复一些复杂的枚举更容易。