2013-11-04 51 views
0

我有一個批處理文件,它經過幾百個嵌套directorys並將所有文件複製到一個目的地(有效地壓平源的副本)。我的批處理文件是:用python遞歸複製和拼合一個目錄

set source="X:\" 

set destination="Y:\" 

for /R %source% %%f in (*.*) do xcopy "%%f" %destination% /D /Y 

很簡單,但是我需要它。現在我需要一個能夠在python中做同樣的事情的解決方案。我對Python很新,即使在理論上也不能理解這是如何工作的。我假設我需要os.walk通過所有的嵌套文件夾來獲取文件,並以某種方式複製這些?任何幫助將不勝感激。通過谷歌,我發現瞭如何遞歸查看目錄以及如何複製文件,但我無法找到將兩者結合在一起的任何解決方案。我目前正在使用python2(2.7)。

+0

一些好的建議在這裏。 http://stackoverflow.com/questions/10110417/why-does-this-recursive-copy-function-copy-all-files-into-every-directory-above – crownedzero

+0

'通過谷歌我已經找到了如何通過目錄遞歸以及如何複製文件,但我無法找到任何解決方案將兩者聯繫在一起 - 當您瀏覽每個目錄中的每個文件時,您會對其發出複製命令...您需要更多一點具體...目前這是一個「給我一些代碼」的問題 –

回答

1

你提到你發現瞭如何遞歸地遍歷目錄以及如何複製文件。

嘗試編寫一個程序,只是打印出它看到的每個文件的路徑。

一旦你有這個工作,只需用您的複製功能替換print行。沒有魔法需要!

3

您可以使用os.walk()拿到過的所有文件平坦的迭代器的目錄樹:

def find_files(root): 
    for d, dirs, files in os.walk(root): 
     for f in files: 
      yield os.path.join(d, f) 

現在你可以使用在每個文件的shutil.copy()將它們複製到目標。

0

我懷疑這是接近你在找什麼:

$ cat copy-flatten 
#!/usr/local/cpython-3.3/bin/python 

import os 
import sys 
import shutil 

assert sys.argv[2:] 
assert not sys.argv[3:] 

source_dir = sys.argv[1] 
destination_dir = sys.argv[2] 

for root, dirs, files in os.walk(source_dir): 
    for filename in files: 
     source_path = os.path.join(root, filename) 
     destination_path = os.path.join(destination_dir, filename) 
     print('Copying {} to {}'.format(source_path, destination_path)) 
     shutil.copy(source_path, destination_path) 

$ cat Makefile 

go: 
     rm -rf ./dest 
     mkdir -p ./dest 
     ./copy-flatten /usr/src ./dest 

clean: 
     rm -rf ./dest