Étonnamment, pas de réponse dans 6 ans utilise l' -i
option ou donne une belle sortie alors je vais aller:
TLDR - Montre-moi juste les commandes
rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Comprendre le résultat
Voici un exemple de la sortie:
L file-only-in-Left-dir
R file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms
Notez le premier caractère de chaque ligne:
L
/ R
signifie que le fichier / répertoire apparaît uniquement dans les L
répertoires eft ou R
ight.
X
signifie que le fichier apparaît sur les deux côtés , mais ne sont pas les mêmes (dans ce cas , les 11 caractères suivants vous donnent plus d' informations. s
, t
et p
représentent les différences de s Ize, t emps et p ermissions respectivement - pour plus d' informations essayer man rsync
et rechercher --itemize-changes
) .
Options supplémentaires que vous voudrez peut-être utiliser
Si vous souhaitez également comparer le propriétaire / groupe / autorisations des fichiers, ajoutez les options -o
/ -g
/ -p
respectivement. Enfin, notez que par défaut, rsync considère que deux fichiers sont identiques s’ils ont le même nom, la même heure et la même taille. C'est extrêmement rapide et la plupart du temps plus que suffisant, mais si vous voulez être sûr -c
à 100%, vous devez également comparer le contenu de fichiers ayant le même nom, la même heure et la même taille.
TLDR - Donnez-moi juste un script à appeler
C'est ici. Appelez ça comme ça
diff-dirs Left_Dir Right_Dir [options]
Toutes les options mentionnées ci-dessus dans la section "Options supplémentaires que vous pouvez utiliser" s'appliquent également ici.
#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L file-only-in-Left-dir
# R file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir.
#
# X means that a file appears on both sides but is not the same (in which
# case the next 11 characters give you more info. In most cases knowing
# that s,t,T and p depict differences in Size, Time and Permissions
# is enough but `man rsync` has more info
# (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
# time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group
if [[ -z $2 ]] ; then
echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
exit 1
fi
set -e
LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"
# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Comment ça marche?
Nous appelons rsync comme ceci:
rsync -rin ...
Nous utilisons -i
( --itemize-changes
) pour indiquer à rsync d’imprimer une ligne de sortie pour chaque fichier contenant des informations sur les différences éventuelles entre les deux répertoires. Nous devons -n
supprimer le comportement normal de rsync (qui consiste à essayer de synchroniser les deux répertoires en copiant / supprimant des fichiers). nous devons également -r
travailler de manière récursive pour tous les fichiers / sous-répertoires.
Nous appelons rsync trois fois:
1er appel : imprimer des fichiers qui n'existent pas dans Dir_B. Nous devons utiliser --ignore-existing
pour ignorer les fichiers qui existent des deux côtés.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2ème appel : exactement comme avant, mais nous échangeons l'ordre de DIR_A / DIR_B.
3ème appel : Enfin, nous utilisons --existing
uniquement pour vérifier les fichiers qui apparaissent dans les deux répertoires.
rsync -rin --existing $DIR_A/ $DIR_B/