rsync hedefteki dosyaları silmez


22

Zaman içinde başka bir dizine değişen bir dizini yansıtmaya çalışıyorum. Benim sorunum, eğer kaynak dizininde mevcut değilse, rsync'in hedefdeki dosyaları silmemesidir. İşte bir demo betiği:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

İşte çıktı:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

Gördüğünüz gibi, "a" dosyası, rsync ikinci kez çalıştırıldıktan sonra hedef dizinde hala mevcut, bu da ihtiyacım olan şey değil. '--Delete' seçeneğini yanlış mı kullanıyorum?


Kaynak dizinlerinin sonunda / * işaretine dikkat edin. Bu, rsync'in yalnızca dizinin kendisinden ziyade bu dosyaları (ve artık varolmayan dosyaların yokluğunu) göz önünde bulundurmasına neden olur.
Walt Stoneburner

Yanıtlar:


9

Bunun nedeni, / tmp / 1 / a dosyasını hiç düşünmeyecek olan / tmp / 1 / b üzerinde rsync'i çağırmanızdır.

Niyetiniz tek tek dosyalar yerine kaynak olarak "/ tmp / 1 /" kullanıyorsanız, / tmp / 1 / dizini rsync yapmak gibi görünüyor, "a" dizinden silinmiş ve silinmiş hedeften.


23

Çıkarın *. Rsync man sayfalarında belirtildiği gibi, --deleteseçenek joker karakter girişleriyle çalışmaz.

Bunun yerine bunu kullanın:

rsync -a --delete $DIR1/ $DIR2/

"Fakat sadece dosyalar dizinleri için, bu alıcı tarafından gereksiz dosyaları (gönderme tarafında değil olanlar) silmek rsync'e --delete. Sen bütün dizin göndermek istedi rsync sahip olmalıdır (örn dirveya dir/) Yönetmenin içeriği için bir joker karakter kullanmadan (örn. dir/*) joker karakter kabuk tarafından genişletildiğinden ve rsync ise, dosyaların üst dizinine değil, tek tek dosyaları aktarma isteğine sahipse, aktarım dışında kalan dosyalar da dışlanır. --delete-excludedseçeneği kullanmadığınız veya kuralları yalnızca gönderen taraftaki eşleşme olarak işaretlemediğiniz sürece silinir (FİLTRE KURALLARI bölümünde değiştiricileri dahil etme / hariç tutma bölümüne bakın). "


Bu, fonksiyonel olarak Sven'in 2011'den gelen cevabı ile aynıdır.
Rowan Hawkins,

8

İkinci rsync satırını rsync -a --delete $DIR1/ $DIR2(* olmadan) değiştirirseniz çalışır. Bunun nedeni, kabuğun *ilk dizindeki dosya adlarına genişlemesidir , ki bu sadece sizin durumunuzda b'dir, bu nedenle eksik dosya a rsync tarafından çalıştırılmakta olan komut gerçekte olduğu gibi değerlendirilmez rsync -a --delete $DIR1/b $DIR2.

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.