shutil reúne operações de filesystem em alto nível, incluindo cópia, movimento, remoção de árvores e criação de arquivos compactados. A conveniência não elimina riscos: destinos existentes podem ser substituídos e metadados não são preservados integralmente em todos os sistemas.

from pathlib import Path
from shutil import copy2, make_archive

origem = Path("relatorios")
backup = Path("backup")
backup.mkdir(exist_ok=True)

for arquivo in origem.glob("*.csv"):
    copy2(arquivo, backup / arquivo.name)

make_archive("backup-relatorios", "zip", root_dir=backup)

copy2() tenta manter mais metadados que copy(), mas proprietário, ACLs e atributos específicos podem se perder. make_archive() cria ZIP ou formatos tar a partir de uma raiz. Confirme o arquivo resultante e teste a restauração, pois criar um backup não prova que ele é recuperável.

Boas práticas

Resolva e valide caminhos antes de operações destrutivas. Não aceite diretamente de usuários um destino para rmtree(), move() ou extração. Ao descompactar conteúdo não confiável, inspecione membros e use os filtros seguros suportados pela versão adotada. Para cópia atômica, escreva em destino temporário e só depois substitua o arquivo final.

Use pathlib para construir caminhos e consulte automação de tarefas em Python para organizar scripts repetíveis.

A documentação oficial de shutil, consultada em 22 de julho de 2026, detalha a API e seus limites.