2009-10-24 74 views
0

目前,我有它运行的find命令,像这样一个bash脚本:使用Python,如何基于文件系统的搜索获取文件信息对象的数组?

find /storage/disk-1/Media/Video/TV -name *.avi -mtime -7 

这得到的电视节目添加到我的系统在过去的7天,一个列表。然后,我继续创建一些符号链接,以便我可以访问我的最新电视节目。我正在寻找在Python中重新编写代码,但我有几个问题,我似乎可以找到使用谷歌的答案(也许我不是在寻找正确的东西)。我认为总结这个问题的最好方法是提出这样一个问题:

如何在我的文件系统上执行搜索(我应该调用find?),它给了我一组文件信息对象(包含修改日期,文件名等),以便我可以根据日期和其他类似事项对它们进行排序?

回答

3
import os, time 

allfiles = [] 
now = time.time() 

# walk will return triples (current dir, list of subdirs, list of regular files) 
# file names are relative to dir at first 
for dir, subdirs, files in os.walk("/storage/disk-1/Media/Video/TV"): 
    for f in files: 
     if not f.endswith(".avi"): 
      continue 
     # compute full path name 
     f = os.path.join(dir, f) 
     st = os.stat(f) 
     if st.st_mtime < now - 3600*24*7: 
      # too old 
      continue 
     allfiles.append((f, st)) 

这将返回所有也返回的文件,如列表(文件名,统计结果)。

+1

太棒了!感谢代码示例,非常有帮助。 – 2009-10-24 11:20:18

+0

关于这个例子有趣的是,时间是从搜索开始的时间开始的,而不是“现在”。因此,如果搜索文件系统的时间超过7天,7天后将不会返回文件。(7天内可能不是问题,但是您希望所有文件的时间少于7分钟。) – vy32 2009-10-24 12:06:22

+0

@simsong:如果搜索花费大量时间,仅通过遍历搜索就无法获得正确的结果文件系统。如果您认为在搜索仍在进行时创建了新文件,那么新文件也可能在已经遍历的部分树中创建。搜索将正确返回搜索开始时小于7天的所有文件。 – 2009-10-24 12:32:29

1
  • 您可以通过“subprocess”模块使用“find”。
  • 之后,使用 “分裂” 的字符串功能解剖每一行
  • 对于每个文件,使用OS模块(例如getmtime等等),以获得文件信息

  • 使用“walk”和“glob”模块获取对象中的文件路径
+0

当不必要时运行子进程效率低下。这里的Glob效率也不高,因为它需要每个目录上的操作次数增加一倍(一次用于散步,然后是第二次操作用于glob) – vy32 2009-10-24 12:04:54

+0

我并没有觉得有那么多优化需要在这里完成。 – jldupont 2009-10-24 12:28:49

2

查看模块os:os.walk是遍历文件系统的函数,os.path是提供文件mtime和其他文件信息的模块。 os.path也定义了很多用于解析和分割文件名的函数。

也感兴趣,模块水珠定义了“通配”的字符串(匹配使用通配符UNIX规则的字符串)

从此,建筑文件符合某些标准应该是很容易的列表的功能。

+0

然而,现在他需要问自己,为什么他需要在Python中编写代码而不是“很酷”? – 2009-10-24 11:13:02

+2

python比bash脚本更具可读性,并且可能更加高效和强大。另外,您可以使用python构建一个完整的应用程序:在他的情况下,他可能希望将搜索与GUI混合在一起,以便于用户使用的方式呈现最后的节目。 – 2009-10-24 11:19:02

+0

他已经这样说过了:他现在想创建符号链接。这可以在纯粹的shell中变得乏味。 – 2009-10-24 11:19:43

相关问题