Sadece değiştirilen dosyaların bir listesini oluşturmak için rsync kullanabilir miyim?


26

Dosyaları birkaç sunucu ile bir NAS arasında senkronize tutmak için bir bash betiğinde rsync kullanıyorum. Karşılaştığım bir sorun, rsync sırasında değişen dosyaların listesini oluşturmaya çalışmak.

Fikir şu ki, rsync'i çalıştırdığımda, bir metin dosyasına değiştirilen dosyaları - bellekteki bir dizi umuduyla - daha sonra komut dosyası mevcut olmadan önce sadece değiştirilmiş dosyalar üzerinde bir chown çalıştırabilirim .

Herhangi biri böyle bir görevi yerine getirmenin bir yolunu buldu mu?

# 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

burada anwer'i görün . -iMaddeyi ayırmak için ayrıca , bir kaç tane daha bükümle ...
Frank Nocke

Yanıtlar:


42

Bu gibi görünen ayrıştırılabilir bir çıktı üretmek için rsync's --itemize-changes( -i) seçeneğini kullanabilirsiniz:

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

~ $ echo 'new stuff' > src/newfile

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

>Birinci konumda karakteri bir dosya güncellendi gösterir kalan karakterler neden örneğin burada belirtmek sve tdosya boyutu ve zaman damgası değiştirdiğini göstermektedir.

Dosya listesini almanın hızlı ve kirli bir yolu olabilir:

rsync -ai src/ dest/ | egrep '^>'

Açıkçası daha gelişmiş ayrıştırma daha temiz çıktılar üretebilir :-)

Ne zaman --itemize-changestanıtıldığını bulmaya çalışırken bu harika bağlantıya rastladım :

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (arşivlenmiş bağlantı)


2
Belirtildiği gibi temiz bir çıkış elde etmek için rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runsadece değiştirilen dosyalar (listelemek istiyorum farklı sağlama toplamı ), kesinlikle bir kaleci, thx :) Bilginize koyarak --dry-runkullanmak yerine komutundan sonra nbenim için en iyi yöntemdir seçeneği
MediaVince

Esasen rsync -zavc src/ dest/ --dry-runayrıntılı
olmayanlarla

14

-nBayrak, -csağlama toplamı bayrağıyla ve bayrağıyla birlikte kullanın -i:

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

Bu örnekte, dosyanın içeriğine bağlı olarak yalnızca bir dosya değişmiştir. Ancak, -nbayrak nedeniyle dosya senkronizasyonu yapılmaz

Bonus

Değiştirilen dosyalar üzerinde chown çalıştırmak istiyorsanız, bunları sedveya ile ayrıştırın ve xargs ile işleyin, örneğin:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY Belgium

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

Takip etmiyorum. Örnekteki bu dosyaların 3'ü '> fcst' olarak işaretlendi, bu da 'uzaktan alındığı' anlamına geliyor, sağlama toplamı farklı, boyut farklı, zaman farklı. Çıktıda ne var "sadece bir dosya değişti"?
bobpaul

1

Bu soru biraz eski ama eklenmeye değer olduğunu düşünüyorum:

-i kısayolu --out-format=%i%n%L

Ve %naraçlar dosya adı, (bölüm log formatarasında man rsyncd.conf)

PS rsync sürüm 3.1.0


Aslında bu cevap bu seçeneği belirtti
Cychih
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.