【问题标题】:List of filenames modified within 1 week1周内修改的文件名列表
【发布时间】:2017-02-19 15:25:18
【问题描述】:

我有一段脚本,它将创建一个文件列表以扫描关键字..

问题是,日志文件总共大约 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?)

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

【问题讨论】:

  • 如果你想优雅地使用man find。否则尝试创建一个Minimal, Complete, and Verifiable 示例。这让我们更容易为您提供帮助。
  • 不确定你的意思,我不知道 find() 是 Python 中的一个东西。我在学。我认为我对我的要求的解释是最小的、完整的和可验证的。希望进一步调整构建我的列表的条件。因此,目前列表logs 包含大量文件名,但我想将其缩减为修改时间小于 604800 秒(1 周)的文件,我将其放在几秒钟内,因为当我使用 @ 987654329@ 然后打印出结果,我得到了一些巨大的数字。我查了os.path.getmtime(),发现结果是秒
  • @StephenRauch - 我可以使用类似于常规 shell 的东西吗? find /path/to/logs -type f -mtime -7 - 这样会干净得多。在 2 周内我一直在学习 Python .. 一切似乎都比普通的 shell 脚本冗长得多。我确信这是我缺乏理解,但目前我正在努力寻找 Python 优于 Bash 的好处。
  • 是的,man find 注释是对查找手册页的引用。对于某些事情,命令行工具更加优雅,因为它们是为这些事情设计的。但是...一旦您的需求变得更加多样化或有深度,python 就是一个非常的好东西。如果您正在尝试使用 python 开发更多的能力,我鼓励您继续这里介绍的项目。但是,如果您需要 SO 用户的帮助,您应该创建一个 MCVE。

标签: python linux logging


【解决方案1】:

根据有多少文件名和多少内存(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

【讨论】:

  • 感谢您的帮助,我将快速了解您的建议。另外,我检查了它确实内存不足。
  • 这很好用!我在find /var/opt/cray/log/p0-current -mtime -7 -maxdepth 1 旁边进行了测试,上面的响应是相同的列表,所以效果很好。我没有得到and os.path.getmtime(x) &gt; week_ago 在我的脑海中这说是mtime 大于1 周吗?还是我错过了什么?
  • mtime 是什么时候,而不是多久以前,所以 > 是之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多