Rsync ile dosyaları taşımak ve dizinleri silmek?


17

Son zamanlarda çok sayıda dosyayı (1 milyondan fazla) silmem gerekiyordu ve bunu okudum:

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

Bunu yapmanın en iyileştirilmiş yollarından biriydi ve bundan daha hızlı olduğunu kefil edebilirim rm -rf.

Bu konuda uzman değilim, ancak benim anlayışımdan rsync performansının nedeninin dosyaları listelediği şekilde yapması gereken bir şey var (sanırım FIFO yerine LIFO). Şimdi sorun şu ki, çok sayıda dosyayı verimli bir şekilde taşımam gerekiyor. Biraz aradıktan sonra bunu buldum:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination

Bu tüm taşınır silerken dosyaları içinde ~/source, dizinleri orada kalır. Ben bir "round-robin" benzeri dizin yapısına sahip olduğundan sayısı files/directoriesçok yakın 1, bu yüzden tamamen tamamen dizini kurtulmak için ilk komutu çalıştırmak zorunda:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

Bir düz mvneredeyse anında bitirir, ancak dizinimde ~/destinationtutulması gereken dosyalar var, bu yüzden mvbir seçenek değil. Ben buldum --prune-empty-dirsve --forcersync seçenekleri, ama ne beklediğiniz gibi çalışmak gibi görünüyor:

--force                 force deletion of directories even if not empty
--prune-empty-dirs      prune empty directory chains from the file-list
--remove-source-files   sender removes synchronized files (non-dirs)

Bir seferde rsync ile bir hareketi taklit etmenin bir yolu var mı ?


2
Burada bir cevap bulamazsanız, rsync listesine göndermeyi deneyin. Çok yardımseverler. lists.samba.org/mailman/listinfo/rsync
Joe

Yanıtlar:


7

Şu konu başlıklı stackoverflow üzerinde buldum: rsync "move" ile klasörleri silme? aslında aynı soruyu soruyor. Yanıtlardan rsyncbiri, dosyaların ve kaynak dizinlerin taşınmasını / kaldırılmasını başarabilecek tek bir komut olmadığından, 2 komutta yapılması önerilir .

$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \
  rsync -av --delete `mktemp -d`/ source/ && rmdir source/

Alternatif olarak, bu komutu kullanarak da yapabilirsiniz:

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

İdeal değil ama iş yapıyor.


Evet, bu soruyu cevaplayan bendim (ve aynı "çözüm" de bu soruda). = P
Alix Axel

@AlixAxel - Ha, üzgünüm buna cevap verdiğini fark etmedim bile. Oh iyi. O zaman bu cevabı sileyim mi?
slm

3
rsyncDizinleri budamak için kullanmak doğru hissetmez ve her zaman tehlike vardır rm -rf. 2. adım olmasını tavsiye ederim:find source/ -d -type d -exec rmdir {} \;
Zany

2
Sadece asla eklemek kullanmak zorunda hissediyorum -deleteve --remove-source-filestek rsync komutu (yukarıdaki örnekler iyidir, bu teğet olan). Açıkladığım şeyi kesip yeniden çalıştırırsanız, aktarılan dosyaları kaybedersiniz. Daha önce yaptığım :(
Sridhar Sarnobat

Temizlik yaparken findbunu tercih ederim: find source/ -type d -empty -delete Bana sadece her şeyi yormayacağına dair garip bir güven duygusu veriyor.
greyfade

10

Zany'nin yorumundan slm'nin cevabına ( Dosyaları taşı ve rsync ile dizinleri sil? ) Cevap olarak şu 2 komutu öneriyorum:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

Avantajı, zany'ın dediği gibi, doğru ya da yeni başlayanlar için rm -rf kullanmanın hala bir tehlikesi var.

2 seçenek, -depth ve -tyty ekledim ve bunun gerçekten gerekli olup olmadığından emin olmasam da, 2. komutu diğer durumlar için daha taşınabilir ve daha güvenli hale getiriyor (bazı dizinler boş değilse hala doğru olanı yapıyor ve dizin ağacındaki en derin noktadan kaldırmaya başlar)


neden sadece -deleteyerine -exec rmdir {} \;?
uçan koyun

@flying_sheep sim'in cevabındaki user7000'in yorumuna bakın: rsync ist kesintiye uğradığında dosyaları kaybedebilirsiniz
mit

Rsync kesildiğinde, buluntu asla başlamaz mı başlamaz? Yani ikinci bir rsync içindeki -delete sorun olmamalı. Ancak -delete de dosyaları kaldırmak yerine, rmdir asla dosyaları silmek, sadece dizinleri. Her ikisi de (-delete ve rmdir) silmeden önce dizinlerin boş olup olmadığını kontrol eder.
benba

Ayrıca adam sayfaları u -exec yerine -execdir kullanmanız gerektiğini söylüyor ...
benba

2

Bu işi tek adımda yapar. Hem kaynak hem de hedef yollardaki sondaki / eğik çizgi / işaretini not alın.

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

Ben user7000 değil kullanımına dikkat yankı --deleteve --remove-source-filesbirlikte aynı çağrısında rsync. İşlem başarısız olursa veya yarıda kesilirse ve aynı çağrı tekrarlanırsa, veri kaybedersiniz. Herhangi bir şüpheniz varsa, --dry-runne yapılacağını görmek için seçeneği kullanın.


-ruvalgereksiz görünüyor. ve her ikisini de içeren -aeşdeğerdir . -rlptgoD-r-l
greyfade
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.