Korzystam z rsync w skrypcie bash, aby synchronizować pliki między kilkoma serwerami i serwerem NAS. Jednym z problemów, na jakie natknąłem się, jest próba wygenerowania listy plików, które zmieniły się w trakcie rsync.
Chodzi o to, że kiedy uruchamiam rsync, mogę wysyłać pliki, które zmieniły się w plik tekstowy - bardziej licząc na tablicę w pamięci - wtedy zanim skrypt będzie istniał, mogę uruchomić chown tylko na zmienionych plikach.
Czy ktoś znalazł sposób na wykonanie takiego zadania?
# 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
dla wyszczególnienia, ale z kilkoma dodatkowymiOdpowiedzi:
Możesz użyć opcji rsync
--itemize-changes
(-i
) do wygenerowania analizowalnego wyniku, który wygląda następująco:>
Postać na pierwszym miejscu wskazuje, że plik został zaktualizowany, pozostałe znaki wskazują, dlaczego, na przykład tutajs
it
wskazują, że rozmiar pliku i timestamp zmieniło.Szybkim i brudnym sposobem uzyskania listy plików może być:
rsync -ai src/ dest/ | egrep '^>'
Oczywiście bardziej zaawansowane parsowanie może zapewnić czystszy wynik :-)
Natrafiłem na ten świetny link, próbując dowiedzieć się, kiedy
--itemize-changes
został wprowadzony, bardzo przydatny:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (link zarchiwizowany)
źródło
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
tylko zmodyfikowane pliki ( inną sumę kontrolną ), zdecydowanie opiekun, dziękuję :) FYI wstawianie--dry-run
polecenia zamiast korzystania zn
opcji jest dla mnie najlepszą praktykąrsync -zavc src/ dest/ --dry-run
bez gadatliwyUżyj
-n
flagi w połączeniu z-c
flagą sumy kontrolnej i-i
flagą:W tym przykładzie zmienił się tylko jeden plik, w zależności od zawartości samego pliku. Jednak synchronizacja plików nie jest wykonywana z powodu
-n
flagiPremia
Jeśli chcesz uruchomić chown na zmienionych plikach, przeanalizuj je za pomocą
sed
lub podobnie i przetworz za pomocą xargs, na przykład:źródło
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
To pytanie jest trochę stare, ale myślę, że warto je dodać:
-i
jest skrótem od--out-format=%i%n%L
I
%n
środki nazwa pliku (odcineklog format
odman rsyncd.conf
)PS rsync wersja 3.1.0
źródło