如何使用 python 覆盖复制完整目录及其内容?

Posted

技术标签:

【中文标题】如何使用 python 覆盖复制完整目录及其内容?【英文标题】:How to use python to copy full directory and its contents overwrittenly? 【发布时间】:2019-04-04 03:35:58 【问题描述】:

文件结构如下:

/email1/垃圾邮件

/email2/垃圾邮件

/email3/垃圾邮件 ...

现在,将所有“垃圾邮件”目录下的所有文件复制到一个名为 /email_data/spam 的新目录

我尝试使用shutil.copytree,但它只复制第一个目录(copytree要求目标必须不存在)。

然后我尝试了distutils.dir_util.copy_tree,它可以工作,但我不知道为什么每次复制后都会出现一些重复的文件。 (例如 spam_email.txt、spam_email_1.txt)。应该有15045个文件,但是代码拷贝16545其中1500多...

【问题讨论】:

是否有需要 Python 的具体原因? rsync 等其他实用程序可能更适合。 是的,我必须使用 python 来做到这一点。 How do I copy an entire directory of files into an existing directory using Python?的可能重复 【参考方案1】:

最后我发现rsync非常好用,就像metatoaster说的,用os.system(command)就行了。

其实distutils.dir_util.copy_tree也可以,copy没有重复错误,源目录本身有重复文件...

【讨论】:

【参考方案2】:

你可以os.walk询问根是否是垃圾邮件,然后才复制shutil的文件。

也许不是最有效的方式,但相当合理。 另一种方法是使用os.system,例如:

find . --path *spam | xargs -I  cp -r  ./spam

尚未验证。

【讨论】:

这没有为 OP 的问题提供有意义的答案。【参考方案3】:

我建议采用shutil.copytree()shutil.copy() 方法,如here 与rsync 结合使用,请参阅this

这是一个未经测试的完整复制粘贴示例:

#!/usr/bin/env python3
import fileinput, os, fnmatch, re, io, errno, shutil
import ignore_patterns from shutil

errorMsgSrc = "Source File does exists, continuing using rsync ..."

def CopyFolder(src, dest):
    try:
        if not os.path.exists(dest):
            shutil.copytree(src, dest, ignore= ignore_patterns('*.json', '*.css', '*.scss', '*.js', '*.jpg', '*.png', '*.xcf'))
            print(errorMsgSrc.rstrip())
        if os.path.exists(dest):
            # Now choose your weapons for overwriting
            # maybe you wanna change working directory with e.g., os.chdir(dir)
            # -arv (archive, recursively and verbose)
            # make sure you got the slashes correct here
            assert os.system("rsync -arv " + src + " " + dest), "ERROR rsync step failed"
            # either delete the source file or use rsync with os.system

    except OSError as e:
    # If the error was caused because the source wasn't a directory
        if e.errno == errno.ENOTDIR:
            shutil.copy(src, dest)
        else:
            print('Directory not copied. Error: %s' % e)

if __name__ == '__main__':
    CopyFolder("source/", "~/home/usr/Desktop/")

【讨论】:

以上是关于如何使用 python 覆盖复制完整目录及其内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个目录/文件夹及其内容复制 100 次?

如何使用 cgi python 脚本在浏览器中显示 pdf 文件内容及其全名?

如何覆盖Java中特定位置的文件内容? [复制]

如何在 PHP 中递归删除目录及其全部内容(文件 + 子目录)? [复制]

将一个目录及其所有内容批量复制到另一个目录

linux centos中使用cp命令复制文件的时候出现omitting directory报错如何解决