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.