Fusionner des dossiers et remplacer des fichiers à l'aide de CLI

9

Je veux mettre à jour un logiciel de forum et je voudrais tester le processus de mise à niveau en utilisant CLI comme possibilité d'apprentissage.

Comment fusionner le contenu d'un dossier dans un autre dossier et remplacer des fichiers?

user46165
la source

Réponses:

10

Vous pouvez utiliser rsyncpour ce faire:

$ rsync -abviuzP src/ dest/
  • -amode archive; est égal à -rlptgoD (pas de -H, -A, -X)
  • -i active le format détaillé, qui affiche plus d'informations que le format par défaut
  • -bcrée des fichiers de sauvegarde rsync qui existent dans les deux dossiers, en ajoutant ~ à l'ancien fichier. Vous pouvez contrôler ce suffixe avec --suffix .suf
  • -u fait rsync transfert ignorer les fichiers qui sont plus récents dans dest que dans src
  • -z active la compression, ce qui est utile lors du transfert de fichiers facilement compressibles sur des liaisons lentes
  • -P active --partial et --progress
    • --partial permet à rsync de conserver les fichiers partiellement transférés si le transfert est interrompu
    • --progress affiche une barre de progression pour chaque transfert, utile si vous transférez de gros fichiers

Je laisserais tomber plusieurs de ces commutateurs, mais c'est juste pour vous aider à démarrer. J'utiliserais probablement quelque chose comme ça:

$ rsync -abuP src/ dest/

Une fois que cela semble OK, vous pouvez exécuter cette commande pour supprimer les fichiers de sauvegarde:

$ find dest/ -name "*.~" -delete

Exemple

Imaginons que nous ayons les exemples de données suivants.

données originales

Nous utiliserons les commandes suivantes pour fabriquer de fausses données.

$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done

Les fausses données se présentent comme suit:

$ tree -DsifvF --noreport dest/
dest
[       4096 Aug 29 22:21]  dest/dir1/
[          2 Aug 29 22:21]  dest/dir1/file1
[       4096 Aug 29 22:21]  dest/dir2/
[          2 Aug 29 22:21]  dest/dir2/file2
[       4096 Aug 29 22:21]  dest/dir3/
[          2 Aug 29 22:21]  dest/dir3/file3
[       4096 Aug 29 22:21]  dest/dir4/
[          2 Aug 29 22:21]  dest/dir4/file4
[       4096 Aug 29 22:21]  dest/dir5/
[          2 Aug 29 22:21]  dest/dir5/file5

nouvelles données

Maintenant, nous allons répliquer les données d'origine ( dest/*-> src/) et ajouter quelques fichiers plus récents au mix. Cela simule une "nouvelle version.

$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done

Les fausses données se présentent comme suit:

$ tree -DsifvF --noreport src/
src
[       4096 Aug 29 22:21]  src/dir1/
[          3 Aug 29 23:00]  src/dir1/file1
[       4096 Aug 29 22:21]  src/dir2/
[          2 Aug 29 22:21]  src/dir2/file2
[       4096 Aug 29 22:21]  src/dir3/
[          3 Aug 29 23:00]  src/dir3/file3
[       4096 Aug 29 22:21]  src/dir4/
[          2 Aug 29 22:21]  src/dir4/file4
[       4096 Aug 29 22:21]  src/dir5/
[          3 Aug 29 23:00]  src/dir5/file5
[       4096 Aug 29 23:00]  src/dir11/
[          5 Aug 29 23:00]  src/dir11/file11

fusionner src / en dest /

Ce que nous imite la configuration que notre nouvel arbre de logiciel src/et souhaitez fusionner dans notre répertoire pré-existant, dest/.

$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
           3 100%    0.00kB/s    0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
           5 100%    4.88kB/s    0:00:00 (xfer#2, to-check=4/13)
dir3/file3
           3 100%    2.93kB/s    0:00:00 (xfer#3, to-check=2/13)
dir5/file5
           3 100%    2.93kB/s    0:00:00 (xfer#4, to-check=0/13)

sent 416 bytes  received 97 bytes  1026.00 bytes/sec
total size is 18  speedup is 0.04

Comme vous pouvez le voir, les fichiers suivants ont été mis à jour, file1, file3, file5 et le nouveau dir11 + file11.

Et comme confirmation, nous pouvons voir que les fichiers de sauvegarde suivants ont été créés au rsyncmoment où il a rencontré les fichiers préexistants dans dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
slm
la source
Pour clarifier le point ci-dessus: Une fois que cela semble OK, vous pouvez exécuter cette commande pour supprimer les fichiers de sauvegarde:> $ find dest / -name "start dot ~" -delete Cela ne semble pas fonctionner pour moi, alors que:> $ find dest / -name "start dot star ~" -delete did. Je ne sais pas si c'est une faute de frappe ou quelque chose de mal configuré de mon côté!
2

Vous pouvez utiliser cp -r name_of_the_folder / * name_of_the_destination_folder où l'astérisque (*) représente tous les fichiers et -r pour la copie récursive.

Vous pouvez également utiliser l'option -i qui vous demandera si vous souhaitez remplacer le contenu.

Spyros Chiotakis
la source