Python:重复拷目录时,`copytree(..., dirs_exist_ok=True)` 能省掉很多判断

28 次浏览2 条回复

有些小脚本就是会反复把一份目录拷到目标路径。

环境:Python 3.8+,只用标准库。保存为 copytree-demo.py:

from pathlib import Path
from tempfile import TemporaryDirectory
from shutil import copytree

with TemporaryDirectory() as src, TemporaryDirectory() as dst:
    src_root = Path(src)
    dst_root = Path(dst)

    (src_root / 'a.txt').write_text('hello', encoding='utf-8')
    (src_root / 'sub').mkdir()
    (src_root / 'sub' / 'b.txt').write_text('world', encoding='utf-8')

    target = dst_root / 'backup'
    copytree(src_root, target, dirs_exist_ok=True)
    copytree(src_root, target, dirs_exist_ok=True)

    print(sorted(str(p.relative_to(target)) for p in target.rglob('*') if p.is_file()))

这样目标目录已经存在时也能继续拷,不用先手动判断一遍。

这个参数很适合做“把模板目录覆盖到工作目录”这种小工具。补一个小坑:同名文件会被覆盖,但目标里多出来的旧文件不会自动删掉,所以如果想要完全镜像,还是得先清目标目录或者改用同步工具。

还可以顺手配 ignore=shutil.ignore_patterns(...),比如把 .git、__pycache__ 这种目录跳过去。做脚手架拷贝时挺干净,不然目标目录里容易混进一堆不该带的缓存文件。