J'ai deux répertoires images et images2 avec cette structure sous Linux:
/images/ad
/images/fe
/images/foo
... et autres 4000 dossiers
et l'autre est comme:
/images2/ad
/images2/fe
/images2/foo
... et autres 4000 dossiers
Chacun de ces dossiers contient des images et les noms des répertoires sous images et images2 sont exactement les mêmes, mais leur contenu est différent. Ensuite, je veux savoir comment je peux copier-fusionner les images de / images2 / ad dans des images / ad, les images de / images2 / foo dans des images / foo et ainsi de suite avec les 4000 dossiers.
Réponses:
C'est un travail pour rsync . Cela ne sert à rien de le faire manuellement avec une boucle du shell, sauf si vous souhaitez déplacer le fichier plutôt que de le copier.
Dans ton cas:
(Notez la fin de la barre oblique
images2
, sinon la copie serait copiée/images/images2
.)Si des images portant le même nom existent dans les deux répertoires, la commande ci-dessus sera écrasée
/images/SOMEPATH/SOMEFILE
par/images2/SOMEPATH/SOMEFILE
. Si vous souhaitez remplacer uniquement les fichiers plus anciens, ajoutez l'option-u
. Si vous souhaitez toujours conserver la version/images
, ajoutez l'option--ignore-existing
.Si vous souhaitez déplacer les fichiers à partir de
/images2
, avec rsync, vous pouvez passer l’option--remove-source-files
. Ensuite, rsync copie tous les fichiers à tour de rôle et supprime chaque fichier à la fin. Cela est beaucoup plus lent que le déplacement si les répertoires source et de destination se trouvent sur le même système de fichiers.la source
rsync
, alorsrm -r /images
.rsync -a images images2
exécutez simplement , il ne fera que copier images2 en images au lieu de les fusionner.Le meilleur choix, comme déjà signalé, est bien sûr rsync. Néanmoins, l'unisson serait également un excellent logiciel pour faire ce travail. Les deux peuvent être utilisés dans plusieurs systèmes d'exploitation.
Rsync
rsync se synchronise dans une direction de la source à la destination. Par conséquent, la déclaration suivante
synchronise tout de la source à la destination . Le dossier fusionné réside dans la destination .
-a signifie "archive" et copie tout de manière récursive de la source à la destination en préservant presque tout.
-v donne plus de sortie ("verbose").
-h pour lisible par l'homme.
--progress pour montrer combien de travail est fait.
Si vous souhaitez uniquement mettre à jour le dossier de destination avec les fichiers les plus récents du dossier source:
Unisson
l'unisson se synchronise dans les deux sens. Par conséquent, la déclaration suivante
synchronise les deux répertoires dans les deux sens et finalement source est égal à destination. C'est comme faire deux fois rsync d'une source à l'autre et vice versa.
Pour des utilisations plus avancées, consultez les pages de manuel ou les sites Web suivants:
la source
rsync -avh --progress source/ destination/
, sinon le dossier source sera créé dans le dossier de destination, du moins dans mon cas, c'était comme ça.Boucle sur tout le contenu de l'
images2
utilisation d'un glob développé (pour éviter les problèmes d'analysels
), puismv
le contenu de ces éléments à l'entrée correspondante dansimages
. Utilisebasename
pour éliminerimages2
le fil conducteur du chemin global.la source
@ inulinux12, vous pouvez utiliser la
for
boucle d' une ligne suivante depuis la ligne de commande:Cela déplacera tous les fichiers
images2
àimages
leurs répertoires respectifs. Remarque: cela suppose qu'aucun fichier ne porte le même nom.Par exemple:
Avant exécution:
Après exécution:
la source
ls
. mywiki.wooledge.org/ParsingLsbasename
dans cette situation particulière (nul besoin d'appelerbasename
pour cela). Merci encore pour vos commentaires constructifs.