使用python递归复制和展平目录

时间:2013-11-04 21:17:17

标签: python batch-file recursion

我有一个批处理文件,它通过几百个嵌套的directorys并将所有文件复制到一个目的地(有效地展平了源的副本)。我的批处理文件是:

set source="X:\"

set destination="Y:\"

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

非常简单,但我需要它做什么。现在我需要一个在python中做同样事情的解决方案。我是python的新手,甚至在理论上也无法弄清楚这是如何工作的。我假设我需要os.walk通过所有嵌套文件夹来获取文件,并以某种方式复制出来???任何帮助将不胜感激。通过谷歌我已经找到了如何递归浏览目录以及如何复制文件,但我找不到任何将两者联系在一起的解决方案。我目前正在使用python2(2.7)。

3 个答案:

答案 0 :(得分: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()将它们复制到目的地。

答案 1 :(得分:1)

你提到你找到了如何递归地遍历目录,以及如何复制文件。

尝试编写一个程序,只打印出它看到的每个文件的路径。

完成后,只需将print行替换为复制功能即可。不需要魔法!

答案 2 :(得分: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