2013-11-04 45 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