2011-08-01 165 views
3

我想遞歸複製一個目錄到另一個目錄。我也想忽略一些文件(例如,所有隱藏的文件;以「。」開頭的所有文件),然後在所有其他文件上(複製它們之後)運行一個函數。這在shell中很簡單,但我需要一個Python腳本。在Python中跳過一些目錄遞歸複製文件?

我試過使用shutil.copytree,它忽略了支持,但我不知道如何讓它在複製的每個文件上做一個函數。我可能還需要在複製時檢查其他一些條件,以便在複製完所有文件後,我不能只運行該功能。我也試着看os.walk,但我無法弄清楚。

+1

告訴我們你試過了什麼,以及你卡在哪裏。 – utdemir

+1

@utdemir確定,添加了幾行,這是更好嗎? – VPeric

+0

「運行文件上的函數」是什麼意思?你打算打開並閱讀它們,或者什麼? –

回答

7

您可以使用os.walk遍歷每個文件,應用您的自定義過濾功能並僅複製您關心的那些文件。

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) 

步行樹無論是自上而下還是自下而上生成的目錄樹中的文件名。對於根目錄頂部(包括頂部本身)樹中的每個目錄,它會生成一個3元組(dirpath,dirnames,文件名)。

您可以將所有複製的文件添加到列表中,並使用它運行自定義腳本或在每次複製操作後運行腳本。

這應該讓你開始:

import os 

def filterls(src, filter_func): 
    for root, dirs, files in os.walk(src): 
     for f in files: 
      if filter_func(f): 
       path = os.path.join(root, f) 
       yield path[len(src)+1:] 

它需要一個目錄路徑並帶有一個參數的函數。如果函數爲傳入的文件名返回False,則該文件將被忽略。

,您可以嘗試在Python解釋是這樣的:

# Get a list of all visible files rooted in the 'path/to/the/dir' directory 
print list(filterls('path/to/the/dir', lambda p: not p.startswith('.'))) 
+1

我嘗試os.walk,但我有點困惑。你能否提供一個例子? – VPeric

+0

@Veric:現在好點? – GaretJax

4

如果你對Python的2.6或更高版本,你可以簡單地使用shutil.copytree及其ignore說法。由於它通過了​​所有的文件和目錄,你可以從那裏調用你的函數,除非你想在之後立即調用複製文件。

如果是這樣,最簡單的事情就是複製和修改copytree的代碼。

+1

我也想支持Python 2.5,但這不是一個硬性要求。另外,請參閱我對編輯的回答,但我無法弄清楚如何將自定義函數應用於每個複製文件(滿足某些條件)。 – VPeric