2014-09-03 60 views
3

我的問題全部複製某些擴展名的文件,同時保持目錄樹

  1. 遍歷目錄,並找到所有的頭文件,*.h
  2. 複製這些文件到另一個位置,但維持目錄樹

我已經試過

我已經能夠收集使用os

所有頭,
for root, dirs, files in os.walk(r'D:\folder\build'): 
    for f in files: 
     if f.endswith('.h'): 
      print os.path.join(root, f) 

此打印正確:

D:\folder\build\a.h 
D:\folder\build\b.h 
D:\folder\build\subfolder\c.h 
D:\folder\build\subfolder\d.h 

當我被困

隨着完整的文件路徑列表,我怎麼才能將這些文件複製到另一個位置,同時保持子目錄?在上面的例子中,我要保持低於\build\

例如目錄結構,我願意副本創建以下:

D:\other\subfolder\build\a.h 
D:\other\subfolder\build\b.h 
D:\other\subfolder\build\subfolder\c.h 
D:\other\subfolder\build\subfolder\d.h 

回答

6

可以使用shutil.copytree忽略可調用以過濾要複製的文件。

「如果給出了忽略,它必須是一個可調用函數,它將接收由copytree()訪問的目錄及其內容列表(...)。可調用函數必須返回一個相對於當前目錄的目錄和文件名(即在第二個參數中的項目的一個子集),這些名字就會在複製過程」

因此,對於您的特定情況下,可以忽略不計,你可以寫:

from os.path import join, isfile 
from shutil import copytree 

# ignore any files but files with '.h' extension 
ignore_func = lambda d, files: [f for f in files if isfile(join(d, f)) and f[-2:] != '.h'] 
copytree(src_dir, dest_dir, ignore=ignore_func) 
+2

python3'ignore_func = lambda d,files:[f for f in file if(Path(d)/ Path(f))。is_file()and f.endswith('.py')] ' – 2017-05-12 15:30:52

2

編輯:正如@pchiquet所示,它可以在一個命令中完成。然而,我會展示如何手動處理這個問題。

你需要三件事情。

你知道你遍歷哪個目錄,所以要構建的目標路徑,你需要去的目的地根目錄的名稱替換源根目錄的名稱:

walked_directory = 'D:\folder\build' 
found_file = 'D:\other\subfolder\build\a.h' 
destination_directory = 'D:\other\subfolder' 
destination_file = found_file.replace('walked_directory', 'destination_directory') 

現在,你有源和目的,首先你需要確保目標存在:

os.makedirs(os.path.dirname(destination_file)) 

一旦它的存在,你可以複製文件:

shutil.copyfile(found_file, destination_file) 
相關問題