Rsync --delete seçeneği hedef dizindeki dosyaları silmez


14

Orijinal dizinde olmayan hedef dizindeki dosyaları silmek için --deleteseçeneği kullanmaya çalışıyorumrsync

İşte kullanıyorum komut:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Benim sorum şu, hedef dizinde orijinal dizinde bulunmayan tüm dosyaları nasıl silebilirim?

Yanıtlar:


14

Bu komutu kullanın:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

"*" İşaretine ihtiyacınız yoktur ve bunu da kullanmamalısınız.

Dosyaları veya dizinleri hariç tutmak / dahil etmek için şu parametreleri kullanmalısınız:

--exclude 'to_exclude*'
--include 'to_include*'

Tamam bunu deneyeyim :)
user2028856

2
Peki --delete komutunun çalışmamasına neden olan "*" çalışmıyor mu?
user2028856

2
Öyle görünüyor. :)
AB

3
--recursiveseçenek -azaten içerdiği için çok fazla
Temak

1
"*" Bazı durumlarda önemli olabilir, çünkü "." İle başlayan dosyaları / dizinleri hariç tutar. Örneğin rsync kullanırken git altında tutulan bir dizini bir geliştirme makinesinden bir üretim makinesine kopyalamak için kullanıyorum. .Git depo dizinini veya .gitignore gibi dosyaları, en üst düzeydeki dosyalar ve alt dizinler de dahil olmak üzere, yalnızca çalışma ağacı eşitlemek istemiyorum.
sootsnoot

14

Komutunuz çalışmadığı için /var/www/*, kaynak olarak kullandığınızda , kabuğunuz üzerinde globbing yapıyor, yani kabuk *bu dizindeki tüm dosyalara genişliyor ve dosyaları tek tek kopyalıyor, bu yüzden burada tek tek dosyalar yerine kaynaklar haline geldi üst dizin.

Bu nedenle, kullanırsanız /var/www/*, dosyaların kopyalandığı ana dizinin değil, dosyaların kopyalanmasına (içeriğine sahip tüm dizinlerle birlikte) neden olacağı için --recursiveseçeneğe ihtiyacınız yoktur *. Aynı nedenden dolayı --deleteçalışmıyorsa, hem --deletehedef dosya kaldıracaktır dizinde kaynak olmayan dizinde , ama onun çıkarmadan değil dosyaları (expectedly) böylece dosyaları kopyalarken.

Bu sizi daha net gösterecektir:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Gördüğünüz gibi, /foo/*bu yüzden rsyncçalıştırılan komut olduğu için kaynağı kullandım

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

ile *yapım kabuk genişletmek üzere ve bir bütün olarak değil üst dizin kaynak tartışmaların yanı tek tek tüm dosyaları yapmak (ve ayrıca gerek yok --recursivebu durumda).

Yani, --deleteiş yapmak istiyorsanız , şu şekilde çalıştırın:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
Gerçek sorunu gösteren mükemmel açıklama: kaynak listesini genişletmek için '*' kullanma.
Antonio Bardazzi

Kabul edilen yanıt hakkındaki yorumumda belirtildiği gibi *, "." İle başlayan dosya ve dizinler gibi şeyleri hariç tutmak için yararlı olabilir. Not ettiğiniz gibi, bu, kaynaktaki en üst düzeyden kaldırılan dosya ve dizinlerin hedef dizinden kaldırılmayacağı anlamına gelir. Kendim için, üst düzey dosyaların hedeften düzgün bir şekilde silinip silinmeyeceği umurumda değil, sadece alt dizinlerin altındaki dosyalar önemlidir. Üst düzey bir alt dizini kaldırmak, bir tane eklemekten çok daha az olasıdır ve bu olası bir durumda hedefe manuel bir rm -r yapmaya hazırım.
sootsnoot
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.