Polecenie kopiowania lub rsync

83

Następujące polecenie działa zgodnie z oczekiwaniami ...

cp -ur /home/abc/* /mnt/windowsabc/

Czy rsync ma nad tym jakąś przewagę? Czy jest lepszy sposób na synchronizację folderu kopii zapasowej co 24 godziny?

shantanuo
źródło
jak dokładnie nie działa zgodnie z oczekiwaniami?
lunixbochs
12
-u oznacza „aktualizację”: kopiuj tylko na brakujące lub starsze pliki. -r oznacza „rekurencyjny”: drążenie w dół struktury katalogów. Musiałem to sprawdzić, pomagając innym noobom. :-)
mightypile
aby uzyskać informacje na temat poszczególnych flag w sekcjach pomocy poleceń, zwykle podążam za czymś takim, <cp --help | grep -e -u> lub jeśli chcesz wykopać informacje o fladze 'r', użyj <cp --help | grep -e -r>. Pokaże ci tylko tę część pomocy, która zawiera treść napisaną po "-e".
paramvir,

Odpowiedzi:

58

Rsync jest lepsza, ponieważ kopiuje tylko zaktualizowane części zaktualizowanego pliku, zamiast całego pliku. Używa również kompresji i szyfrowania, jeśli chcesz. Sprawdź ten samouczek .

marchica
źródło
59

rsync niekoniecznie jest bardziej wydajne ze względu na bardziej szczegółową inwentaryzację plików i bloków, które wykonuje. Algorytm jest fantastyczny w tym, co robi, ale musisz zrozumieć swój problem, aby wiedzieć, czy naprawdę będzie to najlepszy wybór.

W bardzo dużym systemie plików (powiedzmy, wielu tysiącach lub milionach plików), gdzie pliki są zwykle dodawane, ale nie aktualizowane, opcja „cp -u” będzie prawdopodobnie bardziej wydajna. cp podejmuje decyzję o kopiowaniu wyłącznie na podstawie metadanych i może po prostu zabrać się do kopiowania.

Zauważ, że możesz chcieć trochę buforować, np. Używając tar zamiast zwykłego cp, w zależności od rozmiaru plików, wydajności sieci, innej aktywności dysku itp. Bardzo przydatny jest następujący pomysł:

tar cf - . | tar xCf directory -

Same metadane mogą faktycznie stać się znaczącym narzutem w bardzo dużych (klastrowych) systemach plików, ale rsync i cp będą miały ten problem.

Wydaje się, że rsync jest często preferowanym narzędziem (iw aplikacjach ogólnego przeznaczenia jest moim domyślnym wyborem), ale prawdopodobnie jest wiele osób, które na ślepo używają rsync bez zastanowienia.

ckg
źródło
19

Napisane polecenie utworzy nowe katalogi i pliki z aktualną datą i sygnaturą czasową oraz z Tobą jako właścicielem. Jeśli jesteś jedynym użytkownikiem swojego systemu i robisz to codziennie, może to nie mieć większego znaczenia. Ale jeśli zachowanie tych atrybutów jest dla Ciebie ważne, możesz zmodyfikować swoje polecenie za pomocą

cp -pur /home/abc/* /mnt/windowsabc/

-P zachowa własność, znaczniki czasu i tryb pliku. Może to być bardzo ważne w zależności od tego, co tworzysz kopię zapasową.

Alternatywnym poleceniem z rsync byłoby

rsync -avh /home/abc/* /mnt/windowsabc

W przypadku rsync -a oznacza "archiwum", które zachowuje wszystkie wymienione powyżej atrybuty. -v oznacza "gadatliwy", co po prostu pokazuje, co robi z każdym uruchomionym plikiem. -z jest tutaj pomijane dla kopii lokalnych, ale służy do kompresji, która pomoże, jeśli tworzysz kopię zapasową przez sieć. Wreszcie -h mówi rsync, aby raportował rozmiary w formatach czytelnych dla człowieka, takich jak MB, GB itp.

Z ciekawości uruchomiłem jedną kopię, aby przygotować system i uniknąć uprzedzeń w stosunku do pierwszego uruchomienia, a następnie odmierzyłem czas w testowym uruchomieniu 1 GB plików z wewnętrznego dysku SSD na dysk twardy podłączony przez USB. Te po prostu skopiowano do pustych katalogów docelowych.

cp -pur    : 19.5 seconds
rsync -ah  : 19.6 seconds
rsync -azh : 61.5 seconds

Oba polecenia wydają się być mniej więcej takie same, chociaż kompresowanie i rozpakowywanie oczywiście obciąża system, w którym przepustowość nie stanowi wąskiego gardła.

mightypile
źródło
6

Szczególnie, jeśli używasz systemu plików typu „kopiuj przy zapisie”, takiego jak BTRFS lub ZFS, rsyncjest znacznie lepszy.

Używam BTRFS i mam to w moim ~/.bashrc:

alias cp="rsync -ah --inplace --no-whole-file --info=progress2"

Ważną flagą dla CoW FS, takich jak BTRFS, jest --inplaceto, że kopiuje tylko zmienioną część plików, nie tworzy nowych dla małych zmian między i-węzłami plików itp. Zobacz to .

Geremia
źródło
1
Według --inplaceopcji instrukcji : The option implies --partial. Więc myślę, że --partialnie jest to wymagane, przynajmniej w obecnej wersji.
Dcortez
4

Należy pamiętać, że podczas wewnętrznego przesyłania plików na maszynę, tj. Bez przesyłania sieciowego, użycie opcji -z może mieć ogromną różnicę w czasie transferu.

Transfer w ramach tej samej maszyny

Case 1: With -z flag:
    TAR took: 9.48345208168
    Encryption took: 2.79352903366
    CP took = 5.07273387909
    Rsync took = 30.5113282204

Case 2: Without the -z flag:
    TAR took: 10.7535531521
    Encryption took: 3.0386879921
    CP took = 4.85565590858
    Rsync took = 4.94515299797
Ayush Lal Shrestha
źródło
3

W przypadku kopii lokalnej jedyną zaletą rsync jest to, że unika kopiowania, jeśli plik już istnieje w katalogu docelowym. Definicja „już istnieje” to (a) ta sama nazwa pliku (b) ten sam rozmiar (c) ten sam znacznik czasu. (Może ten sam właściciel / grupa; nie jestem pewien ...)

„Algorytm rsync” świetnie nadaje się do przyrostowych aktualizacji pliku przez powolne łącze sieciowe, ale nie da wiele za kopię lokalną, ponieważ musi odczytać istniejący (częściowy) plik, aby wykonać obliczenia „diff”.

Jeśli więc często używasz tego rodzaju poleceń, a zestaw zmienionych plików jest niewielki w stosunku do całkowitej liczby plików, powinieneś zauważyć, że rsync jest szybszy niż cp. (Również rsync ma --deleteopcję, która może Ci się przydać).

Nemo
źródło
3

Nie chodzi o to, co jest bardziej wydajne.

Polecenia „rsync” i „cp” nie są równoważne i służą do różnych celów.

1- rsync może zachować czas tworzenia istniejących plików. (używając opcji -a)
2- rsync uruchomi proces wieloprocesowy i przesyła przy użyciu lokalnych gniazd lub gniazd sieciowych. (tj. rozwidla się na wiele procesów).
3- Wieloprocesowość i wątkowanie zwiększą przepustowość podczas kopiowania dużej liczby małych plików, a nawet wielu większych plików.

Podsumowując, rsync jest przeznaczony do dużych danych, a cp do mniejszego kopiowania lokalnego. (Od MB do małego zakresu GB). Kiedy zaczynasz korzystać z wielu GB lub zakresu TB, skorzystaj z rsync. I oczywiście kopie sieciowe, rsync do końca.

Ellison
źródło
"rsync może zachować czas tworzenia istniejących plików. (używając opcji -a)" - "cp -a" może zrobić to samo i może zrobić to nawet lepiej niż "rsync -a". „Lepiej” oznacza zachowanie jak największej ilości oryginalnych danych i metadanych; przeczytaj unix.stackexchange.com/questions/443911/… . Rsync i cp są prawie równoważne w odniesieniu do -a.
Rublacava
Dziękuję @Rublacava Przeszukiwałem sieć w poszukiwaniu -aporównania.
Francois
1

jeśli używasz cp, nie zapisuje istniejących plików podczas kopiowania folderów o tej samej nazwie. Powiedzmy, że masz te foldery:

/myFolder
  someTextFile.txt

/someOtherFolder
  /myFolder
    wellHelloThere.txt

Następnie kopiujesz jeden na drugim:

cp /someOtherFolder/myFolder /myFolder

wynik:

/myFolder
  wellHelloThere.txt

Przynajmniej tak się dzieje na macOS i chciałem zachować pliki różnic, więc użyłem rsync.

h3dkandi
źródło