Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 1周内修改的文件名列表_Python_Linux_Logging - Fatal编程技术网

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

Python 1周内修改的文件名列表,python,linux,logging,Python,Linux,Logging,我有一段脚本,它将创建一个文件列表来扫描关键字 问题是,日志文件的总容量约为11gb。当我在shell中使用grep搜索它们时,大约需要4到5分钟。当我使用python脚本执行此操作时,它只是将服务器挂起到需要重新启动的程度 它会导致整个服务器崩溃,这似乎不对,但实际上我不需要它滚动浏览所有文件,只需要浏览上周修改过的文件 到目前为止,我已经做到了: logs = [log for log in glob('/var/opt/cray/log/p0-current/*') if not os.

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

问题是,日志文件的总容量约为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?)
logs=[log for log for log in glob('/var/opt/cray/log/p0 current/*'),如果不是os.path.isdir(log)]
对于登录日志:
mtime=os.path.getmtime(日志)
如果mtime<“604800”:
做一些事情(创建一个新的列表?或者更新日志?)

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

根据文件名的数量和内存的多少(512MB VPS?),您可能正在耗尽内存创建两个所有文件名的列表(一个来自环球,一个来自你的理解列表。)不一定是这样,但这就是我要说的

尝试切换到
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

如果你想要优雅,请使用
man find
。否则,请尝试创建一个示例。这样我们可以更容易地帮助你。不确定你的意思,我不知道
find()
是Python中的一件事。我正在学习。我认为我对我的需求的解释是最小的、完整的和可验证的。我希望对构建列表的条件进行进一步的修改。因此,当前列表
日志
包含大量的文件名,但我想将其缩减到修改时间更短的文件超过604800秒(1周)我把它放在几秒钟内,因为当我使用
os.path.getmtime(log)
然后打印结果时,我得到了一些巨大的数字。我查找了
os.path.getmtime()
并发现结果在secs@StephenRauch-我可以使用类似于常规shell的东西吗?
find/path/to/logs-type f-mtime-7
-这会更干净。在我学习Python的两周时间里……所有的事情似乎都比常规shell脚本冗长得多。我肯定这是我缺乏理解,但我很抱歉目前正在努力寻找Python优于Bash的优势。是的,
man find
注释是对find手册页的参考。对于某些事情,命令行工具要优雅得多,因为它们是为这些事情设计的。但是……一旦您的需求变得更加多样化或更深入,Python就是一件非常好的事情知道。如果你想提高python的能力,我鼓励你继续这里介绍的项目。但是,如果你想从SO用户那里得到一些帮助,你应该创建一个MCVE。谢谢你的帮助,我将快速播放一下你的建议。另外,我检查了一下,它确实内存不足。这rks非常好!我在
find/var/opt/cray/log/p0current-mtime-7-maxdepth 1
旁进行了测试,上面的响应是相同的列表,所以它工作得很好。我没有得到
和os.path.getmtime(x)>一周前
在我的脑海中,这是说mtime大于一周?还是我遗漏了什么?mtime在这里是什么时候,而不是多久前,所以>是在之后