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/directories
jest 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 mv
skończyłaby się praktycznie natychmiast, ale mój ~/destination
katalog zawiera pliki, które powinny być przechowywane, więc mv
nie ma opcji. Znalazłem opcje --prune-empty-dirs
i --force
rsync, 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?
Odpowiedzi:
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
rsync
2 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.Alternatywnie możesz to zrobić za pomocą tego polecenia:
Nie idealny, ale spełnia swoje zadanie.
źródło
rsync
do przycinania katalogów nie wydaje się właściwe i zawsze istnieje niebezpieczeństworm -rf
. Polecam drugim krokiem jest:find source/ -d -type d -exec rmdir {} \;
-delete
i--remove-source-files
w 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 :(find
wolę to:find source/ -type d -empty -delete
daje mi dziwne poczucie pewności, że nie wszystko po prostu zatka.Od komentarza zany do odpowiedzi SLM ( Przenieś pliki i usuń katalogi za pomocą rsync? ) Poleciłbym te 2 polecenia jako odpowiedź:
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)
źródło
-delete
zamiast-exec rmdir {} \;
?Wykonuje to zadanie w jednym kroku. Zwróć uwagę na trailing / slash / zarówno na ścieżce źródłowej, jak i docelowej.
Powtarzam ostrzeżenie od user7000, aby nie używać
--delete
i--remove-source-files
razem w tym samym wezwaniu dorsync
. 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-run
opcji, aby zobaczyć, co zostanie zrobione.źródło
-ruval
wydaje się zbędny.-a
jest równoważne z-rlptgoD
, który obejmuje zarówno-r
i-l
.