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 pendant la rsync.
L'idée est que lorsque je lance rsync, je peux sortir les fichiers qui ont changé en un fichier texte - plus en espérant un tableau en mémoire - puis avant que le script n'existe, je peux exécuter un chown sur seulement le 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
Vous pouvez utiliser l'option --itemize-changes
(-i
) De rsync 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 s
et t
indiquent 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 '^>'
Une analyse plus avancée pourrait évidemment produire une sortie plus propre :-)
Je suis tombé sur ce super lien en essayant de savoir quand --itemize-changes
A été introduit, très utile:
http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (lien archivé)
Utilisez le -n
drapeau, combiné avec le -c
indicateur de somme de contrôle et -i
drapeau:
# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt
Dans cet exemple, trois fichiers ont changé, en fonction du contenu (tel que déterminé par la somme de contrôle) du fichier lui-même. Cependant, aucune synchronisation de fichiers n'est effectuée en raison de -n
drapeau
Bonus
Si vous souhaitez exécuter chown sur les fichiers modifiés, analysez-les avec sed
ou similaire et traitez avec xargs, par exemple:
rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ Sudo chown root "test-clone/+"
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 %n
signifie le nom du fichier, (section log format
de man rsyncd.conf
)
P.S. rsync version 3.1.0