Używasz rsync do przenoszenia (nie kopiowania) plików między katalogami?


54

Od pewnego czasu używam rsync do kopiowania plików. Rozumiem, że rsync jest szybszy niż cp, gdy niektóre pliki do przesłania znajdują się już w katalogu docelowym, przenosząc tylko różnicę przyrostową (tj. „Delta”).

Jeśli jest to poprawne, czy przydałoby się użycie rsync do przeniesienia zawartości folderu A , na przykład folderu B , przy czym B jest pusty?

Folder A zawiera prawie 1 TB danych (i miliony plików). Transfer byłby wykonywany przez sieć lokalną ( A i B znajdują się w różnych systemach plików, oba zamontowane na superkomputerze, np. A to NFS, a B to połysk ).

Poza tym, jakich flag powinienem użyć, aby poprosić rsync o przeniesienie (nie kopiowanie) plików z A do B (tj. O usunięcie A po pomyślnym zakończeniu przesyłania)?


7
Nie sądzę, że rsyncmoże zastąpić mv. Spodziewałbym mvsię, że będę działać szybciej na większości typów systemów plików, gdy źródło i miejsce docelowe znajdują się w tym samym systemie plików, ponieważ rsyncmusiałbym wykonać kopię bez względu na wszystko i mvprawdopodobnie mógłbym uniknąć zmiany kilku pozycji katalogu. Najbliższa rzecz, jaką mogę znaleźć, rsync mvto --remove-source-filespolecenie, ale to nie usuwa katalogów.
jw013,

1
Dzięki @ jw013! Aby wyjaśnić, pliki znajdują się w różnych systemach plików, a przesyłanie odbywa się w sieci . Czy wiesz, czy to jeszcze mvprzyspieszyłoby?
Amelio Vazquez-Reina,

1
Cóż, mvnie może działać w sieci - musiałby polegać na lokalnym podłączeniu (np. NFS). Jeśli wąskim gardłem jest sieć, rsyncprawdopodobnie byłby szybszy niż mvponieważ rsyncmoże to zrobić kompresję.
jw013,

2
Nawiasem mówiąc, cpma -uopcję kopiowania pliku źródłowego, jeśli jest nowszy niż plik docelowy lub gdy brakuje pliku docelowego
spiesz się

Odpowiedzi:


69

Możesz przejść --remove-source-filesdo rsync, aby przenieść pliki zamiast je kopiować.

Ale w twoim przypadku nie ma sensu używać rsync, ponieważ miejsce docelowe jest puste. Równina mvwykona zadanie tak szybko, jak to możliwe.

W twoim przypadku, co może mieć wpływ na wydajność, to wybór protokołu sieciowego, jeśli masz wybór pomiędzy NFS, Samba, sshfs, sftp, rsync nad ssh, tar piped do ssh itp. Względna szybkość tych metod zależy na temat rozmiarów plików, przepustowości sieci i dysku oraz innych czynników, więc nie ma sposobu na udzielenie ogólnych porad, musisz uruchomić własne testy porównawcze.


6
Aby powtórzyć to, co mówi Caleb, jeśli martwisz się uszkodzeniem spowodowanym np. Niestabilną siecią, rsync może mieć sens, ponieważ weryfikuje każdy zapisany plik, sprawdzając bloki podczas ich zapisywania.
Daniel S. Sterling,

5
--remove-source-filestylko usuwa pliki w źródle. jeśli chcesz wyczyścić nasze źródło, czy nie musiałbyś wykonać rm -rf (lub findwszystkich katalogów i przekazać -delete) na źródle po pomyślnym uruchomieniu rsync?
Trevor Boyd Smith

1
@ DanielS.Sterling rsync nie zapisuje bloków sumy kontrolnej po ich zapisaniu (używa sum kontrolnych, aby sprawdzić, które części istniejących plików zostały zaktualizowane i wymagają synchronizacji). Możesz wykonać drugą synchronizację --checksum, aby sprawdzić poprawność wyników pierwszej synchronizacji.
Clément

19

Ponieważ --remove-source-filesnie usuwa katalogów, wydaje następujące polecenia, aby przenieść pliki przez ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* user@external.server:/home/user/backup
find . -type d -empty -delete

Osobiście podoba mi się ta --progressfunkcja, ponieważ przesyłam to ręcznie. Usuń go, jeśli używasz skryptu. Oczekuję, że nieznacznie spowolni to transfery. Przez findkasowania opcji poleceń za usuwa tylko puste katalogi - nie używać rm -rf, ponieważ może usuwać niepuste katalogi, w przypadku, gdy plik nie został przekazany. -deleteOpcja włącza -depthopcję tak, że puste drzewa katalogów są usuwane z „dołu” w górę.


3
-deletejest znacznie ładniejszy niż -exec rmdir {} +itp.
lkraav

1
Pominąłbym gwiazdkę, ponieważ i po prostu mam końcowe ukośniki / ścieżki, jeśli robię to lokalnie. Jeśli użyjesz gwiazdki, rsync pominie ukryte pliki, takie jak .htaccess lub .htpasswd (jeśli istnieją)
Svetoslav Marinov

16

Ogólnie rzecz biorąc, jak powiedział Gilles, nie ma żadnej przewagi przy rsyncprzenoszeniu plików, kiedy mvłatwiej wykonać to samo zadanie i nie ma potencjalnego przyrostu prędkości między zwykłymi systemami plików.

Są jednak chwile, w których występuje przewaga. W szczególności, jeśli masz jakiekolwiek wątpliwości co do stabilności źródła, miejsca docelowego lub maszyny wykonującej pracę, użycie rsyncdaje możliwość wznowienia. Może to być znaczącą zaletą, jeśli przeniesienie jest bardzo duże i, powiedzmy, twoja sieć energetyczna jest zawodna. Użycie rsync będzie bardziej stabilnym sposobem na uniknięcie uszkodzenia danych w przypadku awarii i wybranie tam, gdzie zostało przerwane.


4
Powiedziałbym, że to ogromna zaleta. W rzeczywistości powiedziałbym, że mvjest lepszy tylko wtedy, gdy cel i źródło znajdują się na tej samej partycji, więc mvedytuje tylko metadane pliku zamiast kopiować.
nomen

2
Raz potrzebuję, rsynca nie mv, kiedy chcę zachować strukturę folderów (jeśli używasz --relative).
Sridhar Sarnobat

14

czy skorzystanie z rsync przydałoby się przenieść zawartość folderu A, na przykład folderu B, przy czym B jest pusty?

Znalazłem się w sytuacji, gdy rsync IS jest szybszy niż mv po prostu dlatego, że mv nie może obsłużyć liczby plików w katalogu. Mam 1,8 miliona zdjęć z aparatu bezpieczeństwa, który działał przez 20 dni, a polecenie mv kończy się niepowodzeniem, ponieważ nie może przydzielić zasobów.

Wydaje się jednak, że rsync bez problemu obsługuje wszystkie pliki.


1

Jeśli chcesz rekurencyjnie scalać katalogi ... przenieś jeden katalog do innego z potencjalnie zduplikowanymi nazwami katalogów, to proszę zobacz moją odpowiedź tutaj na serverfault.com. mvrobi kiepską robotę, gdy istnieją katalogi o tej samej nazwie, i rsynckopiuje (odczytuje + zapisuje pełne dane) każdy plik zamiast po prostu je przenosić (metadane tylko do odczytu i zapisu).


0

Nie ma sposobu na przeniesienie plików za pomocą rsync, tak jak zrobiłaby to komenda Linux mv. Używając --remove-source-files, zasadniczo kopiujesz pliki do miejsca docelowego, a następnie usuwasz pliki (z wyjątkiem katalogów) ze źródła. Może to pomóc w przeniesieniu plików, ale NIE zaoszczędzisz czasu ani operacji we / wy.

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.