Puis-je utiliser rsync pour créer une liste des seuls fichiers modifiés?

26

J'utilise rsync dans un script bash pour garder les fichiers synchronisés entre quelques serveurs et un NAS. Un problème que j'ai rencontré est d'essayer de générer une liste des fichiers qui ont changé depuis le rsync.

L'idée est que quand je lance rsync, je peux sortir les fichiers qui ont été modifiés dans un fichier texte - plus l' espoir d'un tableau en mémoire - alors avant que le script existe , je peux courir un chown sur seulement les fichiers modifiés.

Quelqu'un a-t-il trouvé un moyen d'effectuer une telle tâche?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done
Jason M.
la source
→ voir ma réponse ici . Aussi -ipour détailler, mais avec quelques rebondissements de plus ...
Frank Nocke

Réponses:

42

Vous pouvez utiliser l' option rsync --itemize-changes( -i) pour générer une sortie analysable qui ressemble à ceci:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

Le >caractère en première position indique qu'un fichier a été mis à jour, les caractères restants indiquent pourquoi, par exemple ici set tindiquent que la taille du fichier et l'horodatage ont changé.

Un moyen rapide et sale d'obtenir la liste des fichiers peut être:

rsync -ai src/ dest/ | egrep '^>'

De toute évidence, une analyse plus avancée pourrait produire une sortie plus propre :-)

Je suis tombé sur ce super lien en essayant de savoir quand a --itemize-changesété introduit, très utile:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (lien archivé)

Kyle Smith
la source
2
Pour une sortie plus propre comme mentionné, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runne listerait que les fichiers modifiés ( somme de contrôle différente ), certainement un gardien, thx :) FYI mettre --dry-runaprès la commande au lieu d'utiliser l' noption est pour moi une meilleure pratique
MediaVince
Essentiellement le même que rsync -zavc src/ dest/ --dry-runsans verbose
MediaVince
14

Utilisez le -ndrapeau, combiné avec le -cdrapeau de somme de contrôle et le -idrapeau:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

Dans cet exemple, un seul fichier a été modifié, en fonction du contenu du fichier lui-même. Cependant, aucune synchronisation de fichiers n'est effectuée en raison de l' -nindicateur

Prime

Si vous souhaitez exécuter chown sur les fichiers modifiés, analysez-les avec sedou similaire et traitez avec xargs, par exemple:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"
JDS
la source
3
sed->cut -d ' ' -f2,-
MUY Belgique
-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner
Je ne suis pas en train de suivre. Tous les 3 de ces fichiers dans l'exemple sont marqués «> fcst», ce qui, selon moi, signifie «reçu de la télécommande», la somme de contrôle diffère, la taille diffère, le temps diffère. Ce qui dans la sortie indique que "un seul fichier a changé" ??
bobpaul
1

Cette question est un peu ancienne, mais je pense qu'elle mérite d'être ajoutée:

-i est un raccourci de --out-format=%i%n%L

Et %nsignifie le nom de fichier, (section log formatde man rsyncd.conf)

PS rsync version 3.1.0

Cychih
la source
En fait, cette réponse mentionnait cette option
Cychih