Comment copier un répertoire de façon récursive en python et écraser tous?
Je suis en train de copier /home/myUser/dir1/
et l'ensemble de son contenu (et leur contenu, etc.) pour /home/myuser/dir2/
en python. En outre, je veux le copier ecraser le tout dans dir2/
.
Il semble comme distutils.dir_util.copy_tree
pourrait être le bon outil pour le travail, mais vous ne savez pas si il n'y a rien de plus facile/plus évident de l'utiliser pour une tâche simple.
Si c'est le bon outil, comment puis-je l'utiliser? Selon le docs il y a 8 paramètres qu'il faut prendre. Dois-je passer toutes les 8 sont juste src
, dst
et update
, et si oui, comment (je suis tout nouveau à Python).
Si il y a quelque chose là-bas c'est mieux, quelqu'un peut-il me donner un exemple et de me diriger dans la bonne direction? Merci à l'avance!
os.system("cp -rf /src/dir /dest/dir")
serait assez facile...- Merci @JoranBeasley (+1) - toutefois, selon
cp
's de docs,-f
arg ("force"): si un fichier de destination existant ne peut pas être ouvert, retirez-la et essayez à nouveau... cela ne semble pas être le même que "remplacer tout". Pouvez-vous confirmer qu'il est le même et que, quelle que soitdir1
s'contenu sont tous get (recrusively) copié àdir2
's sous-arbre? Merci encore! - l'essayer ... il devrait fonctionner correctement 🙂 je n'ai jamais eu de problème avec ça...
cp
remplace les fichiers par défaut. Il y a un interrupteur qui l'empêche d'écraser des fichiers, mais pas l'inverse.- C'est que la méthode indépendante de la plateforme?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
distutils.dir_util.copy_tree
. Il fonctionne très bien et vous n'avez pas à passer chaque argument, seulementsrc
etdst
sont obligatoires.Cependant, dans votre cas, vous ne pouvez pas utiliser un outil similaire comme
shutil.copytree
parce qu'il se comporte différemment: comme répertoire de destination ne doit pas exister cette fonction ne peut pas être utilisé pour l'écrasement de son contenu.Si vous souhaitez utiliser le
cp
outil comme suggéré dans la question des commentaires méfiez-vous que l'utilisation de lasubprocess
module est actuellement la méthode recommandée pour le frai de nouveaux procédés comme vous pouvez le voir dans la la documentation du système d'exploitation.la fonction du système.shutil
etdistutils.dir_util
? Est un est préférable à l'autre en général?distutils
obsolète, ou est-ce seulement en faveur desetuptools
danssetup.py
?Ont un look à la
shutil
paquet, surtoutrmtree
etcopytree
. Vous pouvez vérifier si un fichier /chemin d'accès existe avecos.paths.exists(<path>)
.Vincent a raison à propos de
copytree
pas de travail, si dirs existent déjà. Doncdistutils
est la plus belle version. Ci-dessous est une version fixe deshutil.copytree
. En gros, c'est copié 1-1, à l'exception de la premièreos.makedirs()
placé derrière un if-else-construction:copytree
. Donc, si vous voulez juste cette plaine écraser comme mentionné par @Vincent, vous pouvez simplement utilisershutil.copytree()
et vous avez terminé. Présenter les fichiers sont automatiquement remplacés.shutil.copytree
ne devrait pas fonctionner; si elle le fait, que c'est un bug, parce que ses docs disent que "Le répertoire de destination, nommé par de l'heure d'été, ne doit pas déjà exister".Voici une solution récursive de remplacer une destination avec une source, la création d'un des répertoires nécessaires comme il va. Ce ne gère pas les liens symboliques, mais ce serait une simple extension (voir la réponse de @Michael ci-dessus).
else:
partie.else: shutil.copyfile(src, dest, ignore)
?copyfile()
n'est appelée que pour un seul fichier. Lors de l'utilisation deignore
ensuite, vous passez d'un dossier àsrc
(parce que sinon si vous voulez ignorer le fichier que vous passer àsrc
vous n'auriez pas à faire appel à la fonction à tous). Lors du passage d'un dossier,copyfile()
sera jamais appelé pour les fichiers ignorés.