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?

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”.


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ę.


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


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.

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.