Czy scp może kopiować katalogi rekurencyjnie?

572

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

jądro
źródło

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

dmourati
źródło
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.

Phil Hollenback
źródło
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.

HedgeMage
źródło
10

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

scp -r

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

cp -R
Tarun
źródło
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
mick
źródło
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

użytkownik9869932
źródło
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 [email protected]  '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 [email protected]  '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 [email protected]  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

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

Anubioz
źródło
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 [email protected]:/dest/folder
Franck Dernoncourt
źródło
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.

atthik
źródło
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.

Andrei Pokrovsky
źródło
2
To kompletny nonsens. Istnieje nieskończona liczba przypadków, w których można by użyć, scpale NFS nie jest opcją.
Sven