Scp có thể sao chép thư mục đệ quy?


572

Hiện tại tôi chỉ có thể sao chép một .tartập tin duy nhất . Nhưng làm thế nào tôi có thể sao chép thư mục đệ quy với scp?

Câu trả lời:


936

Đúng, sử dụng -r:

scp -rp sourcedirectory user@dest:/path
  • -r có nghĩa là đệ quy
  • -p bảo toàn thời gian sửa đổi, thời gian truy cập và chế độ từ tệp gốc.

Lưu ý: Điều này tạo ra sourcedirectorybên trong /pathdo đó các tệp sẽ ở trong/path/sourcedirectory


9
Tuy nhiên, hãy nhớ rằng điều này sẽ không bảo tồn các liên kết tượng trưng.
CpnCrunch

12
Lưu ý rằng -pr(các tùy chọn theo thứ tự đảo ngược) sẽ không sao chép các thư mục, thay vì nội dung của chúng vào thư mục đích (rõ ràng, thứ tự của các tùy chọn quan trọng).
pms

172

Mặc dù các câu trả lời trước là đúng về mặt kỹ thuật, bạn cũng nên xem xét sử dụng rsyncthay thế. rsyncso sánh dữ liệu ở các bên gửi và nhận với một cơ chế khác để nó không phải gửi lại dữ liệu đã được gửi trước đó.

Nếu bạn định sao chép một cái gì đó vào một máy từ xa nhiều lần, hãy sử dụng rsync. Trên thực tế, nó tốt để sử dụng rsyncmọi lúc vì nó có nhiều điều khiển hơn cho những thứ như sao chép quyền và quyền sở hữu tệp và loại trừ các tệp hoặc thư mục nhất định. Nói chung:

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

sẽ đồng bộ hóa một thư mục cục bộ với một thư mục từ xa. Nếu bạn chạy nó lần thứ hai và nội dung của thư mục cục bộ không thay đổi, sẽ không có dữ liệu nào được chuyển - hiệu quả hơn nhiều so với việc chạy scpvà sao chép mọi thứ mọi lúc.

Ngoài ra, rsynccho phép bạn phục hồi từ chuyển bị gián đoạn rất dễ dàng, không giống như scp.

Cuối cùng, các phiên bản hiện đại rsynctheo mặc định chạy qua ssh, vì vậy nếu scpđã hoạt động, rsyncthì khá nhiều nên là một sự thay thế thả xuống.


1
Tôi đồng ý rsynclà hiệu quả hơn. Một điều hiện tại nó scpkhông làm là cho phép sao chép giữa các máy chủ từ xa (ít nhất là không chạy ứng dụng khách rsync trên một trong số chúng).
Hiệp sĩ Cedric

1
-av: v là dành cho verbose, một kho lưu trữ và là lối tắt đến -rlptgoD ngụ ý đệ quy, giữ nguyên ngày tháng và liên kết của chủ sở hữu quyền. Nếu bạn chỉ muốn sử dụng đệ quy-r
pdem


10

Tùy chọn sao chép đệ quy '-r' (viết thường)

scp -r

Mà tôi nhầm lẫn với tùy chọn sao chép đệ quy cục bộ thông thường '-R' (chữ hoa)

cp -R

1
Tôi chỉ muốn chỉ ra sự khác biệt giữa cp và scp vì -r và -R không giống nhau. unix.stackexchange.com/questions/18712/ấc
Tarun

6

Cách tốt nhất là sử dụng rsync trên SSH

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

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

Các tùy chọn yêu thích của tôi là -Pazvessh --delete:

  • -a: chế độ lưu trữ (bao gồm rất nhiều tùy chọn phổ biến mặc định, bao gồm bảo toàn liên kết tượng trưng)
  • -z: nén
  • -v: verbose: hiển thị tập tin
  • -P: hiển thị progess như các tệp được thực hiện / các tệp còn lại
  • -e ssh: làm rsync trong giao thức ssh
  • --delete: xóa các tệp ở đích không còn trong nguồn

Tất cả các phiên bản rsyncmà tôi đã sử dụng sẽ sử dụng sshtheo mặc định, do đó -esshkhông cần thiết. Và lựa chọn lệnh được sử dụng để kết nối với máy chủ từ xa thực sự không liên quan đến việc sao chép đệ quy.
kasperd

4

Sau khi tìm kiếm cờ sao chép đệ quy và sử dụng thành công nhờ bài đăng này, tôi chỉ muốn gửi một đề xuất.

Nếu trường hợp là bạn đang sao chép (đệ quy) một thư mục. Có lẽ nếu các tệp được gửi nén, bạn có thể tiết kiệm thời gian trong quá trình chuyển

Những gì tôi đã làm cuối cùng là:

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

Hi vọng điêu nay co ich


phần mở rộng tập tin phải là .tar.gzhoặc .tgzvì tập tin là một kho lưu trữ tar được nén (vì -zcờ được sử dụng).
vang

2

Bạn có thể sao chép đệ quy một thư mục vào một kho lưu trữ nén bằng lệnh đơn giản này:

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

Ví dụ, để sao chép nội dung của /var/logtừ domain.comđể ~/logs.tgzbạn chạy:

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

Bạn cũng có thể trích xuất các tập tin trên hệ thống đích bằng cách sử dụng các đường ống. Lệnh này sẽ sao chép nội dung /var/logtại domain.comđến ~/destination/logtrên hệ thống của bạn:

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

Mặc dù để phản chiếu một thư mục, có lẽ bạn nên sử dụng rsync...


1

Nếu bạn muốn truyền mật khẩu của người dùng dưới dạng tham số thay vì nhập mật khẩu một cách tương tác, bạn có thể sử dụng sshpass( sudo apt-get install -y sshpass).

Thí dụ:

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

0

Bạn có thể sử dụng tùy chọn -r với lệnh scp để sao chép các thư mục đệ quy trên bất kỳ hệ thống nào. Nếu bạn cần bất cứ điều gì khác tham khảo hướng dẫn lệnh scp . Tùy chọn -r là viết tắt của hoạt động đệ quy trong hầu hết các lệnh Linux.


Mặc dù đúng, -rtùy chọn này đã được đề xuất từ ​​nhiều năm trước và là câu trả lời được chấp nhận.
RalfFriedl

-3

Một tùy chọn khác (có thể tốt hơn để sử dụng nhiều lần) là sử dụng NFS - kiểm tra nfs-kernel-server và cách thiết lập chia sẻ NFS.


2
Điều này là hoàn toàn vô nghĩa. Có những trường hợp vô tận mà bạn sẽ sử dụng scpnhưng NFS không phải là một lựa chọn.
Sven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.