2009-10-24 39 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

相關問題