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
-i
pour détailler, mais avec quelques rebondissements de plus ...Réponses:
Vous pouvez utiliser l' option rsync
--itemize-changes
(-i
) pour générer une sortie analysable qui ressemble à ceci:Le
>
caractère en première position indique qu'un fichier a été mis à jour, les caractères restants indiquent pourquoi, par exemple icis
ett
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 '^>'
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é)
la source
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
ne listerait que les fichiers modifiés ( somme de contrôle différente ), certainement un gardien, thx :) FYI mettre--dry-run
après la commande au lieu d'utiliser l'n
option est pour moi une meilleure pratiquersync -zavc src/ dest/ --dry-run
sans verboseUtilisez le
-n
drapeau, combiné avec le-c
drapeau de somme de contrôle et le-i
drapeau: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'
-n
indicateurPrime
Si vous souhaitez exécuter chown sur les fichiers modifiés, analysez-les avec
sed
ou similaire et traitez avec xargs, par exemple:la source
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
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 de fichier, (sectionlog format
deman rsyncd.conf
)PS rsync version 3.1.0
la source