Czy scp może kopiować katalogi rekurencyjnie?


572

Obecnie mogę skopiować tylko jeden .tarplik. Ale w jaki sposób mogę rekurencyjnie kopiować katalogi scp?

Odpowiedzi:


935

Tak, użyj -r:

scp -rp sourcedirectory user@dest:/path
  • -r oznacza rekurencyjny
  • -p zachowuje czasy modyfikacji, czasy dostępu i tryby z oryginalnego pliku.

Uwaga: To tworzy sourcedirectorywnętrze, /pathwięc pliki będą w/path/sourcedirectory


9
Pamiętaj jednak, że nie zachowa to dowiązań symbolicznych.
— CpnCrunch

12
Zauważ, że -pr(opcje w odwrotnej kolejności) nie skopiują folderów, lecz raczej ich zawartość do katalogu docelowego (najwyraźniej kolejność opcji ma znaczenie).
— pms

171

Chociaż poprzednie odpowiedzi są technicznie poprawne, należy również rozważyć użycie rsynczamiast tego. rsyncporównuje dane po stronie wysyłającej i odbierającej z mechanizmem różnicowym, aby nie musiał ponownie wysyłać danych, które zostały wcześniej wysłane.

Jeśli zamierzasz skopiować coś na zdalne urządzenie więcej niż raz, użyj rsync. W rzeczywistości warto z niego korzystać za rsynckażdym razem, ponieważ ma więcej opcji kontroli takich jak kopiowanie uprawnień do plików i własności oraz wykluczanie niektórych plików lub katalogów. Ogólnie:

$ rsync -av /local/dir/ server:/remote/dir/

zsynchronizuje katalog lokalny ze zdalnym katalogiem. Jeśli uruchomisz go po raz drugi, a zawartość katalogu lokalnego nie ulegnie zmianie, żadne dane nie zostaną przesłane - znacznie wydajniejsze niż uruchamianie scpi kopiowanie wszystkiego za każdym razem.

Ponadto rsyncpozwala bardzo łatwo odzyskać z przerwanych transferów, w przeciwieństwie do scp.

Wreszcie, nowoczesne wersje rsyncdomyślnie działają na ssh, więc jeśli scpjuż działa, rsyncpowinno być prawie zamiennikiem.


1
Zgadzam się, że rsyncjest bardziej wydajny. Jedną z rzeczy, których obecnie nie scprobi, jest zezwolenie na kopiowanie między zdalnymi hostami (przynajmniej bez uruchamiania klienta rsync na jednym z nich).
— Cedric Knight

1
-av: v jest dla pełnego, a dla archiwum i jest skrótem do -rlptgoD, co oznacza rekurencyjne, zachowanie dat właściciela i linków. Jeśli chcesz tylko używać rekurencyjnego-r
— pdem

32

Po to jest -ropcja. :)

Zobacz stronę podręcznika użytkownika scp, aby uzyskać więcej informacji w razie potrzeby.


10

Opcja kopiowania rekurencyjnego „-r” (małe litery)

scp -r

Które mylę ze zwykłą lokalną opcją kopiowania rekurencyjnego „-R” (wielkie litery)

cp -R

1
Chciałem tylko wskazać różnicę między cp a scp, ponieważ -r i -R nie są takie same. unix.stackexchange.com/questions/18712/…
— Tarun,

6

Najlepszym sposobem jest użycie rsync przez SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Moje ulubione opcje to -Pazvessh - usuń:

  • -a: tryb archiwizacji (zawiera wiele domyślnych wspólnych opcji, w tym zachowanie dowiązań symbolicznych)
  • -z: kompres
  • -v: verbose: pokaż pliki
  • -P: pokaż postęp jako pliki zrobione / pozostałe pliki
  • -e ssh: do rsync w protokole ssh
  • --delete: usuwa pliki w miejscu docelowym, których już nie ma w źródle

Wszystkie wersje rsync, których użyłem, użyłyby sshdomyślnie, więc -esshjest mało prawdopodobne, aby były potrzebne. A wybór polecenia służącego do połączenia ze zdalnym hostem nie ma żadnego związku z rekurencyjnym kopiowaniem.
— kasperd

4

Po szukaniu rekurencyjnej flagi kopiowania i pomyślnym użyciu jej dzięki temu postowi, chciałbym opublikować tylko sugestię.

Jeśli przypadek polega na tym, że kopiujesz (rekurencyjnie) katalog. Może jeśli pliki zostaną wysłane skompresowane, możesz zaoszczędzić czas na przesyłaniu

W końcu zrobiłem:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Mam nadzieję że to pomoże


rozszerzenie pliku powinno być albo, .tar.gzalbo .tgzponieważ plik jest archiwum tar zzzipowanym (ponieważ -zflaga jest używana).
— anthonybell

2

Za pomocą tego prostego polecenia możesz rekurencyjnie skopiować katalog do skompresowanego archiwum:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Na przykład, aby skopiować zawartość /var/logz domain.comdo ~/logs.tgzciebie uruchom:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Możesz także wyodrębnić pliki w systemie docelowym za pomocą potoków. To polecenie skopiuje zawartość /var/logat domain.comdo ~/destination/logw twoim systemie:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Chociaż do wykonania kopii lustrzanej katalogu, prawdopodobnie powinieneś użyć rsync...


1

Jeśli wolisz przekazać hasło użytkownika jako parametr zamiast wprowadzać je interaktywnie, możesz użyć sshpass( sudo apt-get install -y sshpass).

Przykład:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Opcji -r można użyć z poleceniem scp, aby rekursywnie kopiować katalogi w dowolnym systemie. Jeśli potrzebujesz czegoś innego, zapoznaj się z samouczkiem polecenia scp . Opcja -r oznacza operację rekurencyjną w większości poleceń Linuksa.


Chociaż jest to prawda, -ropcja została już zasugerowana lata temu i jest przyjętą odpowiedzią.
— RalfFriedl

-3

Inną (prawdopodobnie lepszą do wielokrotnego użytku) opcją jest użycie NFS - sprawdź serwer jądra nfs i jak skonfigurować udziały NFS.


2
To kompletny nonsens. Istnieje nieskończona liczba przypadków, w których można by użyć, scpale NFS nie jest opcją.
— Sven
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.