Rekurencyjna / głęboka kopia katalogu wiersza poleceń w systemie Linux?

13

Jaki jest dobry, ogólny sposób na utworzenie rekurencyjnej / głębokiej kopii katalogu w systemie Linux, który działa w większości przypadków? Użyłem prostych rzeczy, jak cp -Rrównież dość skomplikowanych cpiozaklęć. Czy są jakieś mocne i słabe strony, które powodują, że wolisz jedną od drugiej? Z którego najczęściej korzystasz?

Greg Mattes
źródło

Odpowiedzi:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

W odpowiedzi na twoje pytanie:

cp -a /foo /bar

Skopiuj wszystko rekurencyjnie z katalogu / foo do katalogu / baru, zachowując jednocześnie dowiązania symboliczne i plik / katalog „tryb” „własność” i „znaczniki czasu”.

Gareth
źródło
Jest to z pewnością bardzo proste i eleganckie rozwiązanie. Czy kiedykolwiek znalazłeś jakieś wady tego podejścia? Rozproszone systemy plików? Niezwykle duże kopie? Czy zauważyłeś, że inne rozwiązania, takie jak cpio, tar lub rsync, są bardziej wydajne w niektórych przypadkach?
Greg Mattes
1
O ile nie wystąpi błąd fizyczny, nigdy nie miałem błędu lokalnego „cp” z pamięci (wykonałem tylko transfery wielkości TB) do dowolnego miejsca zamontowanego lokalnie (niezależnie od montażu NFS lub Samby). Zapoznaj się z „UŻYCIEM” na stronie podręcznika użytkownika rsync, aby znaleźć przykłady, które mogą Cię pouczyć. Ulubione moje: $ rsync - partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth
Jak zauważyłem powyżej, -a nie jest ściśle przenośny.
Matthew Flaschen
Cóż, wiem, że busybox, GNU i BSD cp są w porządku. Inne niż starsze pudełka Unixa Nigdy nie widziałem, na czym to nie zadziała? Naprawdę nie widzę sensu, chociaż całkowicie rozumiem zdanie Zoredache'a: „Zawsze wydaje się, że praca jest wykonywana poprawnie, więc nigdy tak naprawdę nie szukałem ciężko znaleźć zastępcę”.
Gareth
@gyaresu Rozważ podzielenie drugiego komentarza na inną odpowiedź, abyśmy mogli na niego głosować.
Greg Mattes
6

Najczęściej używam polecenia typu „cd $ srcdir; tar -c. | Tar -C $ destdir -x” . Ale używam również rsync -a $ src $ dst.

Największą zaletą rozwiązania tar jest to, że musiałem użyć go w systemie wiele lat temu, który nie miał procesora cpio, rsync ani cp, który kopiowałby rekurencyjnie. Smoła jest praktycznie wszędzie. Utknąłem na głowie, ponieważ dużo go używałem, prawdopodobnie są bardziej eleganckie sposoby. Zawsze wydaje się, że praca jest wykonywana poprawnie, więc nigdy tak naprawdę nie szukałem ciężko znaleźć zastępcę.

Zoredache
źródło
Bardzo podoba mi się argument „wszechobecność tar”. Jestem biegły w vi z podobnych powodów, chociaż wolę inne środowiska edycyjne.
Greg Mattes
-R już dawno był częścią standardu ( opengroup.org/onlinepubs/009695399/utilities/cp.html ), chociaż nie -a.
Matthew Flaschen
@Matthew Flaschen: Czy twój komentarz jest przeznaczony na odpowiedź @ gyaresu?
Greg Mattes
Jest to również istotne w tym przypadku, ponieważ Zoredache powiedział, że napotkał system, który „nie miał [...] procesora, który kopiowałby rekurencyjnie”. Zasadniczo -R -> przenośne, -a -> nieprzenośne.
Matthew Flaschen
1
To było z powrotem w ~ 95 i system działał pod koniec lat 80-tych w wersji Uniksa. Nie sądzę, żeby -R było opcją dla cp, ale nie jestem pewien. Nauczyłem się, że smakołyk czyta usenet.
Zoredache
6

Spójrz na rsync ... Podoba mi się, ponieważ kopiujesz mniej danych, gdy aktualizujesz dwa katalogi ... może również działać zdalnie. W najprostszej formie rsync -a / src / dest

trent
źródło
To naprawdę dobry punkt. Zasadniczo rsync ma możliwość obliczenia „różnic katalogu” i przesłania tylko tego, co jest potrzebne do synchronizacji katalogów. Możesz więc wielokrotnie wywoływać coś takiego jak rsync -a src / dest w celu „ciągłego kopiowania” katalogów rekurencyjnie (trailing / on src jest potrzebny do właściwej synchronizacji), podczas gdy cp -a src / dest nie działa w ten sposób. Polecenie cp utworzy nowy katalog src w dest po pierwszym cp. Potrzebujesz następnych kopii cp -au src / * dest.
Greg Mattes
Innym powodem, dla którego lubię rsync, jest przekazanie flagi -P, która pokazuje pasek postępu. Daje to pojęcie o tym, ile czasu to zajmie
Rory,
0

rsyncjest doskonałym narzędziem. To szwajcarski scyzoryk służący do przesyłania danych. To takie proste i potężne narzędzie. Gdy zaczniesz go używać, jesteś uzależniony.

Rory
źródło