2008-09-23 47 views
1

我有一段有用的Bash腳本,我沒有設法翻譯成Python,其中'a'是用戶輸入的天數文件:如何在純Python中表示這個Bash命令

find ~/podcasts/current -mindepth 2 -mtime '+`a`+' -exec mv {} ~/podcasts/old \; 

我對最常用的跨平臺元素的os.name和getpass.getuser很熟悉。我也有這個功能,生成的所有文件的全名在〜/播客的當量/列表電流:

def AllFiles(filepath, depth=1, flist=[]): 
    fpath=os.walk(filepath) 
    fpath=[item for item in fpath] 
    while depth < len(fpath): 
     for item in fpath[depth][-1]: 
      flist.append(fpath[depth][0]+os.sep+item) 
     depth+=1 
    return flist 

首先,必須有一個更好的方式來做到這一點,任何建議歡迎。無論哪種方式,例如,「AllFiles('/ users/me/music/itunes/itunes music/podcasts')」在Windows上給出相關列表。大概我應該能夠瀏覽這個列表並調用os.stat(list_member).st_mtime並將所有比特定數字更早的東西移動到歸檔文件中;我有點卡住了。

當然,任何與bash命令簡潔的東西也會有所照亮。

回答

5
import os 
import shutil 
from os import path 
from os.path import join, getmtime 
from time import time 

archive = "bak" 
current = "cur" 

def archive_old_versions(days = 3): 
    for root, dirs, files in os.walk(current): 
     for name in files: 
      fullname = join(root, name) 
      if (getmtime(fullname) < time() - days * 60 * 60 * 24): 
       shutil.move(fullname, join(archive, name)) 
+0

要獲取文件的mtime,請使用os.path.getmtime(全名)而不是os.stat(全名).st_mtime – 2008-09-23 05:49:30

+0

謝謝!成立。 – wnoise 2008-09-23 08:08:07

2

這不是一個Bash命令,它是一個find命令。如果你真的想把它移植到Python上,那麼你可能永遠無法編寫一個簡潔的Python版本。 find經過20年的優化,在操作文件系統方面非常出色,而Python是一種通用編程語言。

0
import os, stat 
os.stat("test")[stat.ST_MTIME] 

會給你mtime。我建議修復那些在walk_results[2],然後遞歸,調用walk_results[1]中的每個目錄的功能。

+0

您實際上可以像這樣引用mtime:os.stat('test')。st_mtime - 它不需要導入stat模塊。 – Jerub 2008-09-23 02:19:48

3
import subprocess 
subprocess.call(['find', '~/podcasts/current', '-mindepth', '2', '-mtime', '+5', 
       '-exec', 'mv', '{}', '~/podcasts/old', ';'], shell=True) 

這不是一個笑話。這個python腳本將完成bash的功能。

編輯:刪除最後一個參數中的反斜槓,因爲它不是必需的。