我有一个批处理文件,它通过几百个嵌套的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)。
答案 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