Yanıtlar:
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.
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.
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 ...
--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.