web-dev-qa-db-fra.com

Comment copier-fusionner deux répertoires?

J'ai deux répertoires images et images2 avec cette structure sous Linux:

/images/ad  
/images/fe  
/images/foo  

... et 4000 autres dossiers

et l'autre est comme:

/images2/ad  
/images2/fe  
/images2/foo

... et 4000 autres 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 copier-fusionner les images de/images2/ad en images/ad, les images de/images2/foo en images/foo et ainsi de suite avec tous les 4000 dossiers.

126
ssierral

Ceci est un travail pour rsync . Il n'y a aucun avantage à le faire manuellement avec une boucle Shell, sauf si vous souhaitez déplacer le fichier plutôt que de les copier.

rsync -a /path/to/source/ /path/to/destination

Dans ton cas:

rsync -a /images2/ /images/

(Notez la barre oblique de fin sur images2, sinon il serait copié dans /images/images2.)

Si des images du même nom existent dans les deux répertoires, la commande ci-dessus remplacera /images/SOMEPATH/SOMEFILE avec /images2/SOMEPATH/SOMEFILE. Si vous souhaitez remplacer uniquement les fichiers plus anciens, ajoutez l'option -u. Si vous souhaitez toujours conserver la version dans /images, ajoutez l'option --ignore-existing.

Si vous souhaitez déplacer les fichiers de /images2, avec rsync, vous pouvez passer l'option --remove-source-files. Ensuite, rsync copie tous les fichiers tour à tour et supprime chaque fichier une fois terminé. C'est beaucoup plus lent que de se déplacer si les répertoires source et de destination sont sur le même système de fichiers.

Le meilleur choix, comme déjà indiqué, 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

rsync -avh --progress Source Destination

synchronise tout de Source à Destination . Le dossier fusionné réside dans Destination .

- a signifie "archiver" et copie tout récursivement de la source à la destination en préservant presque tout.

- v donne plus de résultats ("verbeux").

- h pour une lecture humaine.

- progression pour montrer combien de travail est effectué.

Si vous souhaitez uniquement mettre à jour le dossier de destination avec des fichiers plus récents du dossier source:

rsync -avhu --progress source destination

Unisson

l'unisson se synchronise dans les deux sens. Par conséquent, la déclaration suivante

unison Source Destination

synchronise les deux répertoires dans les deux directions et enfin la source est égale à la destination. C'est comme faire rsync deux fois de la source à la destination et vice versa.

Pour des utilisations plus avancées, consultez les pages de manuel ou les sites Web suivants:

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/
46
debiarch
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

Parcourez tout le contenu de images2 en utilisant un glob développé (pour éviter les problèmes avec l'analyse ls) puis mv le contenu de ces éléments à l'entrée correspondante dans images. Utilise basename pour supprimer le premier images2 à partir du chemin globulé.

5
Etan Reisner

@ inulinux12, vous pouvez utiliser la boucle d'une ligne for à partir de la ligne de commande:

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

Cela déplacera tous les fichiers de images2 à images dans leurs répertoires respectifs. Remarque: cela suppose qu'aucun fichier ne porte le même nom.

Par exemple:

Avant l'exécution:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

Après exécution:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5
1
Simply_Me