在1周内修改的文件名列表

时间:2017-02-19 15:25:19

标签: python linux logging

我的脚本中有一段会创建一个文件列表来扫描关键词。

问题是,日志文件总共约为11GB。当我在shell中使用grep来搜索它们时,大约需要4到5分钟。当我使用我的python脚本执行此操作时,它只是将服务器挂起到我需要重新启动它的程度。

它似乎是正确的,它会导致整个服务器崩溃,但实际上我不需要它来滚动所有文件,只是那些在上周被修改的文件。

到目前为止我已经知道了这一点:

 logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]

我假设我需要在此之前添加一些内容来初步过滤掉错误的文件?

我以这种格式玩os.path.getmtime

logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.path.isdir(log)]

for log in logs:
    mtime = os.path.getmtime(log)
    if mtime < "604800":
       do-stuff (create a new list? Or update logs?)

这就是我现在所处的位置,但它不起作用,但我希望我能用内联列表做更优雅的事情?

1 个答案:

答案 0 :(得分:3)

根据文件名的数量和内存的少(512MB VPS?),您可能会耗尽内存,创建两个所有文件名列表(一个来自glob和一个从你的列表理解。)不一定是这种情况,但我必须继续。

尝试切换到iglob(使用os.scandir并返回迭代器)并使用生成器表达式,看看是否有帮助。

此外,getmtime获得时间,而不是从现在开始的时间间隔。

import os
import glob
import time

week_ago = time.time() - 7 * 24 * 60 * 60
log_files = (
    x for x in glob.iglob('/var/opt/cray/log/p0-current/*')
    if not os.path.isdir(x)
    and os.path.getmtime(x) > week_ago
)
for filename in log_files:
    pass  # do something