Est-il possible de comparer deux répertoires avec rsync et d'imprimer uniquement les différences? Il existe une option d'analyse à sec, mais lorsque j'augmente la verbosité à un certain niveau, chaque fichier comparé est affiché.
ls -alR
et diff
n’est pas une option ici, car il y a des liens durs dans la source rendant chaque ligne différente. (Bien sûr, je pourrais supprimer cette colonne avec perl.)
Réponses:
Vous devrez probablement exécuter quelque chose comme
rsync -avun --delete
dans les deux sens.Mais qu'essayez-vous réellement d'accomplir?
Mise à jour :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
vous donnera une liste de fichiers qui n'existent pas dans le répertoire cible."grep delet" car chaque ligne s'imprime: supprime ing ..file ..
rsync -avun $SOURCE $TARGET
vous donnera une liste de "différents" fichiers (y compris les nouveaux fichiers).la source
Pour ajouter à la réponse de Nils (pour toute personne rencontrant cela via Google), par défaut,
rsync
compare uniquement la taille des fichiers et les temps de modification pour indiquer s'il existe des différences. (Si celles-ci sont différentes, cela en fait plus, mais si elles sont identiques, cela s'arrête là.)Si vous souhaitez comparer le contenu réel d'un fichier , même pour des fichiers ayant la même taille et la même heure de dernière modification, ajoutez l'indicateur
-c
permettantrsync
de comparer les fichiers à l'aide d'une somme de contrôle.(L'
-u
option indique à rsync d'ignorer les fichiers qui sont plus récents dans$TARGET
que sur$SOURCE
, que vous ne voulez probablement pas si vous comparez le contenu.)la source
--no-group --no-owner --no-perms --no-times
ou une combinaison de celles-ci en fonction de vos besoins.-a
place de-a
, par exemplersync -rlDcnv --delete $SOURCE $TARGET
--delete
à la liste des fichiers n'existant que dans$TARGET
Juste pour ceux qui sont moins familiers avec
rsync
:-n
: Bit le plus important - ne pas changer quoi que ce soit;-rc
: comparer uniquement le contenu (sinon utiliser-ac
);-v
: liste les fichiers)--delete
: recherchez une différence symétrique et non unidirectionnelle./
signifie "regarder à l'intérieur du répertoire et comparer son contenu à la destination".PS Je sais que c'est un PS terrible - mais il a en effet été ajouté dans l'urgence. Néanmoins, je parie que cela pourrait être utile.
PPS. Alternativement, on pourrait aussi faire
Si les noms de fichiers ne contiennent pas de nouvelles lignes, nous pouvons alors trier les deux
*.md5
fichiers etdiff
les. (Cela ne fonctionnera que pour les fichiers, c’est-à-dire qu’un répertoire vide de chaque côté ne sera pas détecté.)la source
É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
Comprendre le résultat
Voici un exemple de la sortie:
Notez le premier caractère de chaque ligne:
L
/R
signifie que le fichier / répertoire apparaît uniquement dans lesL
répertoires eft ouR
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
etp
représentent les différences de s Ize, t emps et p ermissions respectivement - pour plus d' informations essayerman 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
Toutes les options mentionnées ci-dessus dans la section "Options supplémentaires que vous pouvez utiliser" s'appliquent également ici.
Comment ça marche?
Nous appelons rsync comme ceci:
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.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.la source
--rsync-path="sudo rsync"
à chaque commande rsync. Deuxièmement, je voulais comparer le répertoire local avec le répertoire distant. J'ai ajouté--rsh "ssh -p1234"
parce que dans mon cas, SSH fonctionne sur le port 1234. Ensuite, j'ai appelé script commediff-dirs [email protected]:/mnt/Vol1/dir1/ /localMnt/dir1 -c
.Je comprends de votre question que vous ne voulez pas utiliser diff sur ls , mais vous pouvez également utiliser diff de manière récursive sur les répertoires:
la source
Il m'a fallu quelques essais pour que cela fonctionne. La réponse de Nils exige que
$TARGET
se termine par une fin/
, comme expliqué par ョ ー.Voici une version qui ajoute explicitement la fin
/
:Cela donne la liste des fichiers qui se trouvent sous le
${SOURCE}
répertoire mais pas sous le${TARGET}
répertoire.J'utilise
sed
ici pour supprimer le débutdeleting
des lignes de sortie et pour n'imprimer que ces lignes.Je n'utilise pas cette
rsync
option-c
car la comparaison du contenu d'un fichier serait beaucoup plus lente pour mes cas d'utilisation, et comparer uniquement la taille du fichier et les temps de modification semble également suffisant dans ces cas. Je n'ai aucune raison de penser que mes ordinateurs souffrent de problèmes d'horloge ou que quelque chose a changé malicieusement l'horodatage. En outre, le résultat de-c
ne peut pas changer la décision de supprimer un fichier, mais uniquement la décision de mettre à jour ou de conserver un fichier.J'utilise aussi
-u
et-a
(plutôt que-r
), pour pouvoir ultérieurement réutiliser la ligne de commande et la modifier pour copier les répertoires et fichiers sélectionnés de${SOURCE}
vers${TARGET}
, comme ceci:la source
J'ai une autre idée de faire ceci:
Vous pouvez faire correspondre "FILEDETAIL ::" au résultat de la commande. Vous pouvez également modifier la chaîne "FILEDETAIL ::". Le "% n" est le nom du fichier.
-r Ceci indique à rsync de copier les répertoires de manière récursive.
-n Ceci oblige rsync à effectuer un essai sans aucune modification.
la source