Bisakah saya menggunakan rsync untuk membuat daftar hanya file yang diubah?

26

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
Jason M.
sumber
→ lihat jawaban saya di sini . Juga -iuntuk perincian, tetapi dengan beberapa tikungan lagi ...
Frank Nocke

Jawaban:

42

Anda dapat menggunakan opsi rsync --itemize-changes( -i) untuk menghasilkan output yang dapat diuraikan yang terlihat seperti ini:

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

~ $ echo 'new stuff' > src/newfile

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

The >karakter di posisi pertama menunjukkan file telah diupdate, karakter yang tersisa menunjukkan mengapa, misalnya di sini sdan tmenunjukkan 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-changesdiperkenalkan, sangat berguna:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (tautan arsip)

Kyle Smith
sumber
2
Untuk output yang lebih bersih seperti yang disebutkan, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runhanya akan mendaftarkan file yang diubah ( checksum berbeda ), pasti penjaga, thx :) FYI menempatkan --dry-runsetelah perintah daripada menggunakan nopsi bagi saya adalah praktik terbaik
MediaVince
Intinya sama dengan rsync -zavc src/ dest/ --dry-runtanpa verbose
MediaVince
14

Gunakan -nbendera, dikombinasikan dengan -cbendera checksum dan -ibendera:

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

Dalam contoh ini, hanya satu file yang berubah, berdasarkan pada isi file itu sendiri. Namun, tidak ada sinkronisasi file yang dilakukan karena -nflag

Bonus

Jika Anda ingin menjalankan chown pada file yang diubah, parsing dengan sedatau mirip dan proses dengan xargs, misalnya:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"
JDS
sumber
3
sed->cut -d ' ' -f2,-
MUY Belgium
-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner
Saya tidak mengikuti. Ketiga file tersebut dalam contoh ditandai '> fcst' yang saya pahami berarti 'diterima dari jarak jauh', checksum berbeda, ukuran berbeda, waktu berbeda. Apa dalam output menunjukkan bahwa "hanya satu file yang berubah" ??
bobpaul
1

Pertanyaan ini agak lama, tapi saya pikir layak untuk ditambahkan:

-i adalah jalan pintas dari --out-format=%i%n%L

Dan %nberarti nama file, (bagian log formatdari man rsyncd.conf)

PS rsync versi 3.1.0

Cychih
sumber
Sebenarnya jawaban ini menyebutkan opsi itu
Cychih