Bisakah scp menyalin direktori secara rekursif?

573

Saat ini saya hanya dapat menyalin satu .tarfile. Tetapi bagaimana saya bisa menyalin direktori secara rekursif scp?

inti
sumber

Jawaban:

937

Yup, gunakan -r:

scp -rp sourcedirectory user@dest:/path
  • -r berarti rekursif
  • -p mempertahankan waktu modifikasi, waktu akses, dan mode dari file asli.

Catatan: Ini menciptakan bagian sourcedirectorydalam /pathsehingga file akan masuk/path/sourcedirectory

dmourati
sumber
9
Namun perlu diingat bahwa ini tidak akan mempertahankan symlink.
CpnCrunch
12
Perhatikan bahwa -pr(opsi dalam urutan terbalik) tidak akan menyalin folder, tetapi lebih baik isinya ke direktori target (tampaknya, urutan opsi penting).
pms
172

Meskipun jawaban sebelumnya secara teknis benar, Anda juga harus mempertimbangkan untuk menggunakannya rsync. rsyncmembandingkan data pada sisi pengirim dan penerima dengan mekanisme berbeda sehingga tidak perlu mengirim ulang data yang sudah dikirim sebelumnya.

Jika Anda akan menyalin sesuatu ke mesin jarak jauh lebih dari sekali, gunakan rsync. Sebenarnya, itu baik untuk digunakan rsyncsetiap kali karena memiliki lebih banyak kontrol untuk hal-hal seperti menyalin izin dan kepemilikan file dan mengecualikan file atau direktori tertentu. Secara umum:

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

akan menyinkronkan direktori lokal dengan direktori jarak jauh. Jika Anda menjalankannya untuk kedua kalinya dan isi direktori lokal tidak berubah, tidak ada data yang akan ditransfer - jauh lebih efisien daripada menjalankan scpdan menyalin semuanya setiap waktu.

Juga, rsyncmemungkinkan Anda untuk memulihkan dari transfer yang terganggu dengan sangat mudah, tidak seperti scp.

Akhirnya, versi modern rsyncsecara default melebihi ssh, jadi jika scpsudah berfungsi, rsyncseharusnya cukup menjadi pengganti drop-in.

Phil Hollenback
sumber
1
Saya setuju rsynclebih efisien. Satu hal yang saat ini tidak dilakukan scpadalah memperbolehkan penyalinan antar host jarak jauh (setidaknya tanpa menjalankan klien rsync di salah satunya).
Cedric Knight
1
-av: v adalah untuk verbose, a untuk arsip dan merupakan jalan pintas ke -rlptgoD yang menyiratkan rekursif, menjaga tanggal dan tautan pemilik hak. Jika Anda hanya ingin menggunakan rekursif-r
pdem
11

Opsi Salin Rekursif '-r' (huruf kecil)

scp -r

Yang saya bingung dengan opsi salinan rekursif lokal biasa '-R' (huruf besar)

cp -R
Tarun
sumber
1
Saya hanya ingin menunjukkan perbedaan antara cp dan scp karena -r dan -R tidak sama. unix.stackexchange.com/questions/18712/…
Tarun
6

Cara terbaik adalah menggunakan rsync di atas SSH

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

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

Opsi favorit saya adalah -Pazvessh --delete:

  • -a: mode arsip (termasuk banyak opsi umum standar, termasuk melestarikan symlink)
  • -z: kompres
  • -v: verbose: tampilkan file
  • -P: tunjukkan proses saat file selesai / file tersisa
  • -e ssh: lakukan rsync dalam protokol ssh
  • --delete: hapus file di tujuan yang tidak lagi di sumbernya
mick
sumber
Semua versi rsyncyang saya gunakan akan digunakan sshsecara default, jadi -esshtidak mungkin diperlukan. Dan pilihan perintah yang digunakan untuk terhubung ke host jarak jauh benar-benar tidak terkait dengan menyalin secara rekursif.
kasperd
4

Setelah mencari bendera salinan rekursif, dan berhasil menggunakannya berkat posting ini, saya ingin memposting hanya saran.

Jika masalahnya Anda menyalin (secara rekursif) direktori. Mungkin jika file yang dikirim terkompresi Anda dapat menghemat waktu dalam transfer

Apa yang saya lakukan pada akhirnya adalah:

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

Semoga ini membantu

pengguna9869932
sumber
ekstensi file harus berupa .tar.gzatau .tgzkarena file tersebut adalah arsip tar yang di-gzip (karena -zflag digunakan).
anthonybell
2

Anda dapat menyalin direktori secara rekursif ke arsip terkompresi dengan perintah sederhana ini:

ssh -p 22 [email protected]  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Misalnya, untuk menyalin isi /var/logdari domain.comke ~/logs.tgzAnda menjalankan:

ssh -p 22 [email protected]  'cd /var && tar zcvf - log' > ~/logs.tgz

Anda juga dapat mengekstrak file pada sistem target dengan menggunakan pipa. Perintah ini akan menyalin konten /var/logat domain.comke ~/destination/logdi sistem Anda:

ssh -p 22 [email protected]  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Meskipun untuk mencerminkan direktori, Anda mungkin harus menggunakan rsync...

Anubioz
sumber
1

Jika Anda lebih suka meneruskan kata sandi pengguna sebagai parameter daripada memasukkannya secara interaktif, Anda dapat menggunakan sshpass( sudo apt-get install -y sshpass).

Contoh:

sshpass -p 'remote_password' scp -rp /src/folder [email protected]:/dest/folder
Franck Dernoncourt
sumber
0

Anda dapat menggunakan opsi -r dengan perintah scp untuk menyalin direktori secara rekursif pada sistem apa pun. Jika Anda membutuhkan yang lain, lihat tutorial perintah scp . Opsi -r adalah singkatan dari operasi rekursif di sebagian besar perintah Linux.

atthik
sumber
Meskipun benar, -ropsi telah disarankan tahun lalu dan merupakan jawaban yang diterima.
RalfFriedl
-3

Opsi lain (kemungkinan lebih baik untuk penggunaan berulang) adalah menggunakan NFS - lihat nfs-kernel-server dan cara mensetup share NFS.

Andrei Pokrovsky
sumber
2
Ini omong kosong. Ada kasus tak berujung di mana Anda akan menggunakan scptetapi NFS bukan opsi.
Sven