Si j'utilise mv
déplacer un dossier appelé "dossier" vers un répertoire qui contient déjà "dossier" vont-ils fusionner ou seront-ils remplacés ?
Réponse acceptée :
mv
ne peut pas fusionner ou écraser des répertoires, il échouera avec le message "mv :impossible de déplacer 'a' vers 'b' :répertoire non vide" , même lorsque vous utilisez le --force
option.
Vous pouvez contourner ce problème en utilisant d'autres outils (comme rsync
, find
, ou même cp
), mais vous devez examiner attentivement les implications :
rsync
peut fusionner le contenu d'un répertoire dans un autre (idéalement avec le--remove-source-files
option pour supprimer en toute sécurité uniquement les fichiers source qui ont été transférés avec succès, et avec l'option habituelle d'autorisation/propriété/préservation du temps-a
si vous le souhaitez)
… mais il s'agit d'une opération de copie complète, et peut donc être très gourmande en disque.- Option actuellement préférée : Vous pouvez combiner
rsync
--link-dest=DIR
option (pour créer des liens physiques au lieu de copier le contenu du fichier, si possible) et--remove-source-files
pour obtenir une sémantique très similaire à unmv
normal .
Pour cela,--link-dest
doit recevoir un chemin absolu vers la source répertoire (ou un chemin relatif depuis la destination à la source ).
… mais ceci utilise--link-dest
de manière involontaire (ce qui peut ou non entraîner des complications), nécessite de connaître (ou de déterminer) le chemin absolu vers la source (en tant qu'argument de--link-dest
), et laisse à nouveau une structure de répertoire vide à nettoyer selon . - Vous pouvez utiliser
find
pour recréer séquentiellement la structure du répertoire source sur la cible, puis déplacer individuellement les fichiers réels
… mais cela doit se répéter plusieurs fois dans la source et peut rencontrer des conditions de concurrence (nouveaux répertoires créés à la source au cours du processus en plusieurs étapes) cp
peut créer des liens physiques (en termes simples, des pointeurs supplémentaires vers le même fichier existant), ce qui crée un résultat très similaire à une fusionmv
(et est très efficace en termes d'E/S puisque seuls des pointeurs sont créés et qu'aucune donnée réelle ne doit être copiée)
… mais cela souffre à nouveau d'une condition de concurrence possible (les nouveaux fichiers à la source sont supprimés même s'ils n'ont pas été copiés à l'étape précédente)
Laquelle de ces solutions de contournement (le cas échéant) est appropriée dépendra beaucoup de votre cas d'utilisation spécifique.
Comme toujours, réfléchissez avant d'exécuter l'une de ces commandes et ayez des sauvegardes.
1 :Notez que rsync --remove-source-files
ne supprimera aucun répertoire, vous devrez donc faire quelque chose comme find -depth -type d -empty -delete
ensuite pour se débarrasser de l'arborescence vide du répertoire source.