Saya menggunakan rsync dalam skrip bash untuk menjaga file tetap sinkron antara beberapa server dan NAS. Salah satu masalah yang saya temui adalah mencoba membuat daftar file yang telah berubah dari saat rsync.
Idenya adalah bahwa ketika saya menjalankan rsync, saya dapat menampilkan file yang telah berubah menjadi file teks - lebih berharap untuk array dalam memori - maka sebelum skrip ada saya dapat menjalankan chown hanya pada file yang diubah.
Adakah yang menemukan cara untuk melakukan tugas seperti itu?
# 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
untuk perincian, tetapi dengan beberapa tikungan lagi ...Jawaban:
Anda dapat menggunakan opsi rsync
--itemize-changes
(-i
) untuk menghasilkan output yang dapat diuraikan yang terlihat seperti ini:The
>
karakter di posisi pertama menunjukkan file telah diupdate, karakter yang tersisa menunjukkan mengapa, misalnya di sinis
dant
menunjukkan bahwa ukuran file dan cap waktu berubah.Cara cepat dan kotor untuk mendapatkan daftar file mungkin:
rsync -ai src/ dest/ | egrep '^>'
Jelas penguraian yang lebih maju dapat menghasilkan output yang lebih bersih :-)
Saya menemukan tautan hebat ini ketika mencoba mencari tahu kapan
--itemize-changes
diperkenalkan, sangat berguna:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (tautan arsip)
sumber
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
hanya akan mendaftarkan file yang diubah ( checksum berbeda ), pasti penjaga, thx :) FYI menempatkan--dry-run
setelah perintah daripada menggunakann
opsi bagi saya adalah praktik terbaikrsync -zavc src/ dest/ --dry-run
tanpa verboseGunakan
-n
bendera, dikombinasikan dengan-c
bendera checksum dan-i
bendera:Dalam contoh ini, hanya satu file yang berubah, berdasarkan pada isi file itu sendiri. Namun, tidak ada sinkronisasi file yang dilakukan karena
-n
flagBonus
Jika Anda ingin menjalankan chown pada file yang diubah, parsing dengan
sed
atau mirip dan proses dengan xargs, misalnya:sumber
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
Pertanyaan ini agak lama, tapi saya pikir layak untuk ditambahkan:
-i
adalah jalan pintas dari--out-format=%i%n%L
Dan
%n
berarti nama file, (bagianlog format
dariman rsyncd.conf
)PS rsync versi 3.1.0
sumber