Rsync'in bash'de herhangi bir değişiklik yapıp yapmadığını nasıl kontrol edebilirim?


12

Bir uzak -> yerel senaryoda veri eşitlemek için rsync kullanan bir komut dosyası var. Rsync komutu çalıştırıldıktan hemen sonra, hata kodunun sıfıra eşit olup olmadığını kontrol edin. Sıfır ise, başka komutlar gerçekleştirilir. Ancak bu, rsync'in başarılı bir şekilde çalıştığını, ancak aslında herhangi bir değişiklik yapmamış olabileceğini dikkate almaz. Bu nedenle, eşit sıfır koşulu ne olursa olsun çalışır, bu biraz fazlalıktır.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Gerçekleştirilen rsync komutuna göre herhangi bir değişiklik olup olmadığını kontrol etmek için bunu genişletmek için en iyi yaklaşım ne olurdu. -İ bayrağının stdout'a çıktı sağlayabildiğini okudum, ama bu koşullu bir bloğa nasıl yerleştirilebilir?


Sen var -vbu yüzden zaten mesela sen Stdout'a gereken bilgileri ... aslında gönderilen dosyaların bir listesini vermektedir, içeride. Hiçbir şey değişmezse, bu sadece ./.
goldilocks

Ah! -V'yi alıp -i'yi kullanırsam ve sonra rsync komutunda boş olmayan bir dize denetimi kullanırsam ne olur?
James White

Çözümü kendiniz buldunuz mu? :-)
Bjorn Munch

2
kullanabilirsiniz a=$("rsync command"). Bu yürütülür rsynckomuta ve mağaza stdoutiçinde a. Daha sonra testleri yapabilirsiniza
nitishch

1
Ayrıca | grep /böyle bir şey ekleyebilir veya daha sonra grep'in çıkış durumunu kontrol edebilirsiniz, $?çıktı yoksa 1 olmalıdır.
Bjorn Munch

Yanıtlar:


9

Orijinal sorumun yorumlarına dayanarak, -i bayrağıyla stdout'a rsync çıktısı verin ve hata kodu kontrolünde gerçekten bir şey değişip değişmediğini görmek için dize olmayan bir kontrol koşulu kullanın. Rsync komutunun bir değişkene kaydırılması, denetimin yapılmasına izin verir.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Potansiyel dezavantajı, ayrıntılı çıktıyı kaybetmeniz gerekir, ancak bunun yerine her zaman bir dosyaya giriş yapabilirsiniz.


1

Daha katı bir çözüm istedim. Number of created files:(Mesaj başka bir dilde olabilir) veya tüm satırları kaldırmak için -vçıktı ( iki rsyncsonraki sürümde hangi özeti basacak kim bilir ?) İçin grep istemiyorum .

Bir rsyncgünlük dosyasının biçimini ayarlayabildiğinizi ancak stdout'unun biçimini ayarlayamayacağınızı buldum (bkz. man rsyncd.conf).

Örneğin, bir "Dosya değişti!" Bir Gerçekten değişiklik dosyası ile her bir satırın, sonra grepbunun için:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
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.