【问题标题】:Python: recursively copy batch of directoriesPython:递归复制一批目录
【发布时间】:2015-11-19 05:39:19
【问题描述】:

我正在尝试创建一个脚本,允许我们输入一堆目录路径,然后递归地将这些目录复制到新计算机。这是为了我们与员工的计算机更新过程。我知道我可以使用 shutil 将源复制到目标,但我想更进一步,收集所有源目录,然后使用相同的目录路径将它们复制到目标硬盘。

例如: src = G:\users\%specificuser%\Documents dst = C:\users\%specificuser%\Documents

我宁愿不必每次都输入源和目标。所以我想我首先需要知道这在 Python 中是否可行。如果是这样,我从哪里开始?

【问题讨论】:

  • 在 Python 中一切皆有可能。 :)
  • 您关心文件所有权和访问控制列表吗? shutil 不会复制这样的元数据。
  • 目标似乎和源路径相同,除了它所属的磁盘,因此您可以根据源创建目标而无需重新键入

标签: python recursion copy


【解决方案1】:

怎么样:

shutil.copytree(src, dst)

或者实现你自己的复制树,如果需要,它会遍历创建它们的目录(避免“目标目录必须不存在”的问题,正如 cmets 中所指出的那样),有点像单向同步:

import os, os.path, shutil

src="G:\\TestCopy"
dst="D:\\TestCopy"

def copy_tree(srcpath, dstpath):
    print(srcpath)
    if not os.path.exists(dstpath):
        os.makedirs(dstpath)
    for candidate in os.listdir(srcpath):
        srccan = os.path.join(srcpath, candidate)
        dstcan = os.path.join(dstpath, candidate)
        if os.path.isdir(srccan):
            copy_tree(srccan, dstcan)
        else:
            shutil.copyfile(srccan, dstcan)

copy_tree(src, dst)

如果您想从部分路径中根据特定用户构造用户字符串,os.path.join 擅长这样做:

specificuser = "fred"
src = os.path.join("G:\\users", specificuser, "Documents")
dst = os.path.join("D:\\users", specificuser, "Documents")
print(src)
print(dst)

输出:

G:\users\fred\Documents
D:\users\fred\Documents

【讨论】:

  • 您应该指出The destination directory must not already exist.,因此定期从/到相同路径重复该过程可能需要进一步的智能
  • 是的,OP 可能需要一些更微妙的东西,我会编辑我的答案。
  • 投了赞成票,但是,嘿,你全长了。我想问题是在同一路径上重复复制时,即当目标已经存在时。在这种情况下,我只需重命名现有的并继续使用shutil.copytree :)
  • 谢谢@Galax,这正是我需要做的。我不知道 os 和 os.path 模块,所以谢谢你。我是 Python 的超级新手(以防你猜不出来),所以我只是一头扎进。
  • 没问题,Python 有很多有用的模块可以帮助您完成此类工作。祝你好运!
猜你喜欢
  • 2012-10-30
  • 2016-06-06
  • 2010-12-31
  • 2015-05-18
  • 2013-11-06
  • 2016-07-28
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多