GNU/Linux >> Tutoriels Linux >  >> Linux

Comment synchroniser deux dossiers avec des outils en ligne de commande ?

Cela place le dossier A dans le dossier B :

rsync -avu --delete "/home/user/A" "/home/user/B"  

Si vous voulez le contenu des dossiers A et B pour être le même, mettre /home/user/A/ (avec la barre oblique) comme source. Cela ne prend pas le dossier A mais tout son contenu et le place dans le dossier B. Comme ceci :

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -a Effectuez la synchronisation en préservant tous les attributs du système de fichiers
  • -v exécuter de manière détaillée
  • -u copier uniquement les fichiers avec une heure de modification plus récente (ou une différence de taille si les heures sont égales)
  • --delete supprimer les fichiers du dossier cible qui n'existent pas dans la source

Page de manuel :https://download.samba.org/pub/rsync/rsync.html


Vous pourriez unison outil développé par Benjamin Pierce à U Penn.

Supposons que vous ayez deux répertoires,

/home/user/Documents/dirA/ et /home/user/Documents/dirB/

Pour synchroniser ces deux, vous pouvez utiliser :

~$unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

En sortie, unison affichera chaque répertoire et fichier qui est différent dans les deux répertoires que vous avez demandé à synchroniser. Il recommandera de synchroniser de manière additive (répliquer le fichier manquant aux deux emplacements) lors de l'exécution initiale, puis de créer et de maintenir une arborescence de synchronisation sur votre machine, et lors des exécutions suivantes, il implémentera une véritable synchronisation (c'est-à-dire si vous supprimez un fichier de .../dirA , il sera supprimé de .../dirB aussi bien. Vous pouvez également comparer chaque modification et éventuellement choisir de transférer ou inverser synchroniser entre les deux répertoires.

Optionnellement, pour lancer l'interface graphique, il suffit de supprimer le -ui text option de votre commande, bien que je trouve le cli plus simple et plus rapide à utiliser.

Pour en savoir plus :Tutoriel Unison sur la documentation utilisateur Unison.


La réponse de TuxForLife est plutôt bonne, mais je vous suggère fortement d'utiliser -c lors de la synchronisation locale. Vous pouvez affirmer que cela ne vaut pas la peine de perdre du temps/du réseau pour les synchronisations à distance, mais cela en vaut vraiment la peine pour les fichiers locaux car la vitesse est si grande.

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

Cela montre à quel point le fait d'avoir la même taille et les mêmes horodatages peut vous échouer.

La configuration

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

Le rsync qui ne copie rien car les fichiers ont tous la même taille et le même horodatage

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

Le rsync qui fonctionne correctement car il compare les sommes de contrôle

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b

Linux
  1. Linux - Comment synchroniser deux dossiers avec des outils de ligne de commande ?

  2. Comment redémarrer Linux en utilisant la ligne de commande

  3. Comment trier les fichiers dans des dossiers par type de fichier sur bash (avec la commande 'file') ?

  4. Comment convertir un PDF en JPG avec une ligne de commande sous Linux ?

  5. Comment puis-je créer un fichier avec une taille spécifique à partir d'une ligne de commande ?

Comment envoyer un e-mail avec une pièce jointe à partir de la ligne de commande

Comment vérifier la version du système d'exploitation avec la ligne de commande Linux

Comment installer Dig sous Linux avec des exemples de ligne de commande

Comment trouver une adresse IP dans la ligne de commande Linux

Comment contrôler la version avec Git sur la ligne de commande

Comment surveiller la santé du serveur Linux avec des outils de ligne de commande