Przenosić pliki i usuwać katalogi za pomocą rsync?


17

Ostatnio musiałem usunąć dużą liczbę plików (ponad 1 milion) i przeczytałem, że:

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

Był to jeden z najbardziej zoptymalizowanych sposobów, aby to zrobić i mogę ręczyć, że jest szybszy niż rm -rf.

Nie jestem ekspertem w tej dziedzinie, ale z mojego zrozumienia, powód wydajności rsync ma coś wspólnego z listowaniem plików (chyba LIFO zamiast FIFO). Problem polega na tym, że muszę także skutecznie przenosić dużą liczbę plików. Po krótkich poszukiwaniach znalazłem to:

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

Chociaż ten usuwa wszystkie przeniesione pliki w ~/source, katalogi pozostają tam. Ponieważ mam strukturę katalogów podobną do „round-robin”, liczba files/directoriesjest bardzo bliska 1, więc jestem zmuszony ponownie uruchomić pierwsze polecenie, aby całkowicie pozbyć się katalogu:

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

Prosta mvskończyłaby się praktycznie natychmiast, ale mój ~/destinationkatalog zawiera pliki, które powinny być przechowywane, więc mvnie ma opcji. Znalazłem opcje --prune-empty-dirsi --forcersync, ale żadna z nich nie działa tak, jak się spodziewałam:

--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)

Czy istnieje sposób naśladowania ruchu za pomocą rsync za jednym razem?


2
Jeśli nie otrzymasz tutaj odpowiedzi, spróbuj opublikować na liście rsync. Są bardzo pomocni. lists.samba.org/mailman/listinfo/rsync
Joe

Odpowiedzi:


7

Znalazłem ten wątek przy przepełnieniu stosu zatytułowany: Czy usunąć foldery za pomocą rsync „move”? , który zadaje zasadniczo to samo pytanie. Jedna z odpowiedzi sugerowała wykonanie rsync2 poleceń, ponieważ wydaje się, że nie ma jednego polecenia, które może wykonać przeniesienie / usunięcie plików i katalogów źródłowych.

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

Alternatywnie możesz to zrobić za pomocą tego polecenia:

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

Nie idealny, ale spełnia swoje zadanie.


Tak, to ja odpowiedziałem na to pytanie (i to samo „rozwiązanie” dotyczy również tego pytania). = P
Alix Axel

@AlixAxel - Ha, przepraszam, nawet nie zauważyłem, że odpowiedziałeś na to pytanie. No cóż. Czy mam zatem usunąć tę odpowiedź?
slm

3
Używanie rsyncdo przycinania katalogów nie wydaje się właściwe i zawsze istnieje niebezpieczeństwo rm -rf. Polecam drugim krokiem jest:find source/ -d -type d -exec rmdir {} \;
zany

2
Po prostu czuję się zmuszony do dodawania, nigdy nie używaj -deletei --remove-source-filesw jednym poleceniu rsync (powyższe przykłady są w porządku, to jest styczne). Jeśli przerwiesz, a następnie uruchom ponownie to, co opisuję, stracisz przesłane pliki. Zrobiłem to wcześniej :(
Sridhar Sarnobat,

Podczas sprzątania findwolę to: find source/ -type d -empty -delete daje mi dziwne poczucie pewności, że nie wszystko po prostu zatka.
greyfade,

10

Od komentarza zany do odpowiedzi SLM ( Przenieś pliki i usuń katalogi za pomocą rsync? ) Poleciłbym te 2 polecenia jako odpowiedź:

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

Zaletą jest to, jak powiedział zany, że nadal istnieje pewne niebezpieczeństwo związane z używaniem rm -rf, jeśli nie zrozumiesz go poprawnie lub dla początkujących.

Dodałem 2 opcje, -depth i -ppty i chociaż nie jestem pewien, czy jest to naprawdę konieczne, sprawia, że ​​drugie polecenie jest bardziej przenośne na inne sytuacje i jeszcze bardziej bezpieczne (nadal robi to dobrze, jeśli niektóre katalogi nie są puste i zaczyna usuwanie z najgłębszego punktu w drzewie katalogów)


dlaczego nie tylko -deletezamiast -exec rmdir {} \;?
latające owce

@flying_sheep zobacz komentarz user7000 w odpowiedzi SIM: kiedy rsync jest przerywany, możesz stracić pliki
mit

Kiedy rsync jest przerywany, wyszukiwanie nigdy się nie rozpoczyna, czy nie? Więc -delete w drugim rsync nie powinno stanowić problemu. Ale -delete usuwa również pliki, zamiast tego rmdir nigdy nie usuwa plików, tylko katalogi. Zarówno (-delete i rmdir) sprawdzają katalogi, jeśli są puste przed usunięciem.
benba

Ponadto strony podręcznika mówią, że powinieneś używać -execdir zamiast -exec ...
benba

2

Wykonuje to zadanie w jednym kroku. Zwróć uwagę na trailing / slash / zarówno na ścieżce źródłowej, jak i docelowej.

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

Powtarzam ostrzeżenie od user7000, aby nie używać --deletei --remove-source-filesrazem w tym samym wezwaniu do rsync. Jeśli operacja się nie powiedzie lub zostanie przerwana i powtórzy się to samo połączenie, utracisz dane. W razie wątpliwości skorzystaj z --dry-runopcji, aby zobaczyć, co zostanie zrobione.


-ruvalwydaje się zbędny. -ajest równoważne z -rlptgoD, który obejmuje zarówno -ri -l.
greyfade
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.