处理脚本中断

处理脚本中断

我需要迭代 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命令按目录顺序返回文件。目录顺序不稳定;在某些文件系统中,如果添加或删除文件,可能会影响同一目录中其他文件的顺序。

我质疑你关于排序不是一种选择的说法。除非您对每个文件的处理速度非常快,否则构建文件列表的速度相当快。将其保存到文件中,以便在作业中断时可以重复使用。

无论如何,您都需要知道您从哪里停止,并从那里继续。从已经生成的文件列表中恢复比在中间恢复一些复杂的枚举更容易。

相关内容