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?

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~

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.