dosyaları gerçekten değiştirmeden önce rsync'in onay beklemesini sağlayın


10

Yerel ve uzak bir klasör arasında senkronizasyon yapıyorum. Aptal bir komutla bir dosyayı kaybettim.

Asıl dosya aktarımını yapmadan önce birleştirmeye ve onaylama şekline ("go?") Alışkınım.

Rsync ile böyle bir seçenek var mı? (sunucu tarafında bir ilişki yok)

Teşekkürler!

Yanıtlar:


3

Resmi bir "--confirm" seçeneğinin yerine, iki yol arasındaki farkı iki kere hesaplamak zorunda kalmak yerine, rsync'in kendi "toplu modu" kullanılabilir. Toplu mod, değişiklikleri aynalara dağıtmak için tasarlandı (bir kez hesapla, birçok özdeş ağacı güncelle). İki dosya oluşturulur: güncellemeleri içeren bir toplu iş dosyası ve güncellemeyi çalıştırmak için basit bir komut dosyası ( rsync man sayfasının sonuna doğru ayrıntıları içeren bir bölüm var ).

İşte süreci soyutlamak için bir bash sarıcı:

#!/bin/bash

cleanup ()
{
    rm ${BFILE} ${BFILE}.sh &>/dev/null
}

# generate tmpfile
BFILE=$( mktemp )

# rsync command
if ! rsync --only-write-batch="${BFILE}" --verbose "$@"; then
    cleanup
    exit 1
fi

# confirmation
read -p "Continue (y/N)? " confirm
if [ "$confirm" != "y" ]; then
    echo "Aborting"
    cleanup
    exit 1
fi

# carve up arguments
dest="${@: -1}"         # last argument
host="${dest%%:*}"      # host:path
path="${dest#*:}"
opts="${@:1:$(($#-2))}" # everything but the last two args
if [ "$host" = "${path}" ]; then
    # local
    sh "${BFILE}.sh"
else
    # remote
    ssh "$host" rsync --read-batch=- "${opts}" "${path}" <"${BFILE}"
fi

cleanup

Bu betiğin yazdığı için $TMP_DIR, gerçekten büyük veri taşıyorsanız (örneğin, / tmp değerinden daha büyük) boşluk sınırlamaları ile karşılaşabileceğinizi unutmayın.


1
Bu her dosya için bir onay ister mi?
Çok Düzensiz

2
Hayır, bu değişiklikleri hesaplar, görüntüler ve sonra tek bir bilgi istemi görüntüler, "Devam (y / N)?" Bunu kullandığımdan beri bir süre geçti, ancak IIRC, rsync hala uçağı yeniden hesaplıyor gibiydi.
Steve

6

Kuru çalışmayı gerçekleştirmek için -n seçeneğini rsync ile kullanabilirsiniz. rsync, gerçekte yapmadan hangi işlemleri gerçekleştireceğini söyleyecektir. Sonuçlardan memnunsanız, -n seçeneği olmadan tekrar çalıştırın.


5

Ne yazık ki, yazarken Rsync'te yerleşik bir yöntem yoktur.

Mike Fitzpatrick'in çözümü iyi sonuç verecek, ancak çok büyük bir dizin ağacınız varsa, rsync'i tüm dosyalara tekrar sokmayacak bir şey yapmak isteyebilirsiniz.

EDIT: Bir hedef dosyayı silmek istemeyen bir hata da var ... baktıkça gittikçe daha fazla, bu çözüm bozuldu ... senin durumunda çalışabiliyorsa ve birisi de isterse onu bırakıyorum Tamir etmek için. Ayrıca, birinin https://bugzilla.samba.org/enter_bug.cgi?product=rsync adresine resmi bir özellik isteği göndermesi gerekir

Bu senaryoyu ben yazdım:

#! /bin/bash

# Make a temp file for storing the output of rsync

tmpfile=$( mktemp )  &&

# Do all the hard work ( get the list of files we need to update ), 
#  but dont actually change the filesystem

rsync --dry-run --out-format='RSYNC_CONFIRM %i %n%L' "$@" | grep RSYNC_CONFIRM | awk '{ print $3 }' > $tmpfile &&


# Output to the user what we propose to do
rsync --dry-run --itemize-changes --files-from=$tmpfile "$@" &&

# Alternatively, we could just output $tmpfile... but whatever...

read -p "Continue? (y/n)?" &&

if [[ $REPLY = [yY] ]]
then
{
  rsync --files-from=$tmpfile "$@"
}
fi

rm $tmpfile
  • Komut dosyasını, adlı bir dosyaya yapıştırmayı deneyin. rsync-confirm.bash

  • Sonra chmod +x rsync-confirm.bash

  • Sonra ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Bu senaryo biraz bozuk olabilir, kaynak dizinde son derece eğik çizgi yoksa gerçekten hoşuna gitmediğini fark ettim ...


5

--Backup seçeneğini kullanarak üzerine yazmak üzere dosyaları yedeklemek için rsync yapabilirsiniz.

 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)

rsync çalıştırdıktan sonra, dosyalar için backup-dir tarayabilir ve teker teker geri yüklenip istenmediğini sorabilirsiniz.

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.