Si je mv
déplace un dossier appelé "dossier" vers un répertoire contenant déjà "dossier", fusionnera-t-il ou sera-t-il remplacé?
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 l' --force
option.
Vous pouvez contourner ce problème en utilisant d'autres outils (tels que 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 l’ option --remove-source-files
1 de ne supprimer en toute sécurité que les fichiers source transférés avec succès, et avec l’option habituelle autorisation / propriété / conservation de temps -a
si vous le souhaitez) rsync
l' --link-dest=DIR
option (créer des liens physiques au lieu de copier le contenu du fichier, si possible) et --remove-source-files
obtenir une sémantique très similaire à une image normale mv
. --link-dest
faut donner un chemin absolu au répertoire source (ou un chemin relatif de la destination à la source ). --link-dest
de manière non intentionnelle (ce qui peut causer ou non des complications), nécessite de connaître (ou de déterminer) le chemin absolu vers la source (en tant qu'argument --link-dest
), et laisse à nouveau une structure de répertoire vide à nettoyer en tant que pour 1 .find
pour recréer séquentiellement la structure de répertoires source sur la cible, puis déplacer individuellement les fichiers réels cp
peut créer des liens durs (simplement, pointeurs supplémentaires dans le même fichier existant), ce qui crée un résultat très similaire à une fusion mv
(et est très IO-efficace puisque seuls les pointeurs sont créés et aucune donnée réelle doit être copié) 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 effectuez des sauvegardes.
1: Notez que rsync --remove-source-files
cela ne supprimera aucun répertoire, vous devrez donc faire quelque chose comme find -depth -type d -empty -delete
par la suite pour vous débarrasser de l’arborescence du répertoire source vide.
mv
. Cette réponse serait meilleure avec une vérité plus large. Linux, BSD et "réel" Unix, ou une référence de POSIX ou SUS.mv
mise en œuvre utilisée par Debian - l'accent étant mis sur essayé , depuis la page de manuel ne mentionne pas ce comportement ...--delete
seuls les fichiers du répertoire de destination qui n'existent pas dans le répertoire source ne sont supprimés .-H
fonction ou vous pouvez lier des fichiers de la destination en utilisant--link-dest
. Voir la page de manuel avant de les utiliser, cependant.la source
--remove-source-files
présente l’avantage de ne supprimer que les fichiers transférés avec succès. Vous pouvezfind
donc supprimer des répertoires vides et conserver tout ce qui n’a pas été transféré sans avoir à vérifier larsync
sortie.Vous pouvez utiliser l'
-l
option de la commande cp , qui crée des liens physiques de fichiers sur le même système de fichiers au lieu de copies avec données complètes. La commande suivante copie le dossiersource/folder
dans un dossier parent (destination
) qui contient déjà un répertoire avec le nomfolder
.Vous pouvez également utiliser les options
-P
(--no-dereference
- ne pas dé-référencer les liens symboliques) ou-a
(--archive
- conserver toutes les métadonnées, inclut également l'-P
option), en fonction de vos besoins.la source
cp
plutôt quersync
depuis que chaque système acp
et que tout le monde est familiarisé avec elle.cp
avec le temps de fonctionnement demv
.-n
mv /fs1/file /fs2/
(sur tous les systèmes de fichiers) effectuera une copie puis une suppression.mv
cela fonctionnera (à condition que le répertoire cible n'existe pas encore), même s'il n'est pas "efficacement" ou quoi que vous l'appeliez,cp -rl
échouera.Je recommanderais ces quatre étapes:
ou mieux encore, voici un script qui implémente une sémantique semblable à
mv
:la source
rsync -u
(ne mettre à jour que si plus récent),mv
(dans certaines versions au moins) peut également prendre l'-u
option. Toutefois, dans ce cas, vous voudrez peut-être supprimer les répertoires sources non vides, ainsi que ceux vides, pour couvrir les cas où les fichiers de l’arborescence des sources ne sont pas plus récents. @schuess: Il semble y avoir plusieurs arguments SOURCE, si vous en avez besoin.Voici un moyen de fusionner les répertoires. Il est beaucoup plus rapide que rsync car il se contente de renommer les fichiers au lieu de les copier puis de les supprimer.
la source
dest
est déjà un répertoire portant le même nom que danssource
. Et les fichiers seront déplacés vers undest
, qui est danssource
. La commande ne fait rien d'autre quemv source/* source/dest/.
Une façon d'y parvenir serait d'utiliser:
Tant qu'il n'y a pas deux fichiers portant le même nom en
folder
etdirectory/folder
, vous obtiendrez le même résultat, à savoir la fusion.la source
rm folder
?rm folder -fR
marche toujours pour moiPour les copies les plus pures, j'utilise la méthode de copie en lecture de blocs tar (-) B.
exemple, depuis le chemin source ('cd' là-bas si nécessaire):
cela crée une copie exacte de l'arborescence source, avec le propriétaire et les autorisations intactes. Et si le dossier cible existe, les données seront fusionnées. Seuls les fichiers déjà existants seront écrasés.
Exemple:
Lorsque l'action de copie réussit, vous pouvez supprimer la source (
rm -rf <source>
). Bien sûr, ce n’est pas un geste exact: les données seront copiées jusqu’à ce que vous supprimiez la source.En option, vous pouvez être prolixe (afficher à l'écran le fichier en cours de copie), avec -v:
tar cBvf -
c
: créerB
: lire le bloc complet (pour la lecture du tuyau)v
: verbeuxf
: fichier à écrirex
: extrait-
: stdout / stdinsourcefolder
peut aussi être*
(pour tout dans le dossier en cours)la source
f -
tar est généralement inutile - la valeur par défaut est de lire stdin / write sur stdout.Voici un script qui a fonctionné pour moi. Je préfère mv à rsync, alors j'utilise les solutions de Jewel et Jonathan Mayer.
la source
Ce n'est pas une bonne idée d'utiliser des commandes telles que cp ou rsync. Pour les gros fichiers, cela prendra beaucoup de temps. mv est beaucoup plus rapide puisqu'il ne fait que mettre à jour les inodes sans copier physiquement les fichiers. Une meilleure option consiste à utiliser le gestionnaire de fichiers de votre système d'exploitation. Pour Opensuse, il existe un gestionnaire de fichiers appelé Konquerer. Il peut déplacer des fichiers sans les copier. Il a "couper et coller" comme dans Windows. Il suffit de sélectionner tous les sous-répertoires du répertoire A. Cliquez avec le bouton droit de la souris et placez-vous dans le répertoire B qui peut contenir des sous-répertoires du même nom. Cela va les fusionner. Il existe également des options pour écraser ou renommer des fichiers portant le même nom.
la source
mv
est utilisé.Solution python
Comme je ne pouvais pas trouver une solution préexistante satisfaisante, j'ai décidé de créer un script Python rapide pour y parvenir.
En particulier, cette méthode est efficace car elle ne parcourt l'arborescence du fichier source qu'une fois ascendante.
Cela vous permettra également de modifier rapidement des options telles que la gestion de l'écrasement de fichiers à votre guise.
Usage:
déplacera tout le contenu de
src/*
dansdest/
etsrc/
disparaîtra.move-merge-dirs
GitHub en amont .
Voir aussi: https://stackoverflow.com/questions/22588225/how-do-you-merge-two-directories-or-move-with-replace-from-the-windows-command
la source
Cette commande permet de déplacer des fichiers et des dossiers vers une autre destination:
Rappelez - vous : la
mv
commande ne fonctionnera pas si le dossier est bei̲n̲g me̲r̲ge̲d̲ (c’est-à-dire qu’un autre dossier portant le même nom existe déjà dans la destination) et que le dossier est dactylographié .Si le dossier de destination est vide, la commande ci-dessus fonctionnera correctement.
Donc, afin de fusionner les deux dossiers dans tous les cas,
soit le faire en 2 commandes:
Ou combinez les deux comme une commande unique:
la source