Làm cách nào để chỉ sao chép các tập tin mới bằng cách sử dụng lệnh scp Cảnh?


24

Tôi đã sao chép hàng trăm tệp vào một máy tính khác bằng scplệnh mà tôi gặp stalled lỗi . Bây giờ tôi sẽ sao chép các tập tin một lần nữa. Có cách nào để tránh sao chép các tập tin đã được sao chép?

Câu trả lời:


40

Bạn có thể sử dụng rsynccho nó. rsyncđược thực sự thiết kế cho loại hình hoạt động này.

Cú pháp:

rsync -avh /source/path/ host:/destination/path

hoặc là

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

Khi bạn chạy nó lần đầu tiên, nó sẽ sao chép tất cả nội dung sau đó nó sẽ chỉ sao chép các tệp mới.

Nếu bạn cần đường hầm lưu lượng truy cập thông qua kết nối SSH (ví dụ: vì mục đích bảo mật), như được chỉ ra bởi ban đầu bạn yêu cầu giải pháp dựa trên SCP, chỉ cần thêm -e sshvào các tham số rsync. Ví dụ:

rsync -avh -e ssh /source/path/ host:/destination/path

--ignore-existingthực sự cần thiết?
Meysam

Bởi vì trong ví dụ về hướng dẫn sử dụng này: rsync -t *.c foo:src/-> "Điều này sẽ chuyển tất cả các tệp khớp với mẫu * .c từ thư mục hiện tại sang thư mục src trên máy foo. Nếu bất kỳ tệp nào đã tồn tại trên hệ thống từ xa thì rsync remote- cập nhật giao thức được sử dụng để cập nhật tệp bằng cách chỉ gửi những khác biệt "
Meysam 14/12/13

1
Tôi thường sử dụng rsync -avuzh /source/path/ host:/destination/path. Điều đó thực hiện toàn bộ công việc trong một lệnh và trong các lệnh tiếp theo, chỉ chuyển các tệp cần nó.
Edward Falk

6

Nếu bạn muốn gắn bó với scp vì bất kỳ lý do gì, bạn có thể xóa quyền w trên dữ liệu cục bộ của mình (nếu bạn có quyền làm điều đó) và scp sẽ không chạm vào nó. Để được chính xác hơn:

  1. chmod a-w local/*.tar.gz (trong thư mục địa phương của bạn)
  2. scp remote/*.tar.gz local

Điều này không hiệu quả lắm, tốt đẹp nhưng có thể giúp ích nếu bạn cần một giải pháp tạm thời nhanh chóng mà không thay đổi thành thứ gì khác ngoài scp. (Kudos: scp mà không thay thế các tệp hiện có ở đích )


Tôi thực sự thích giải pháp này. Tôi đang thu thập các tập tin từ các cảm biến từ xa vào một kho lưu trữ. Toàn bộ thư mục làm việc - mỗi thư mục có một thư mục con Lưu trữ. Một khi các tập tin đi vào Lưu trữ, chúng sẽ không bao giờ được thay đổi. Sẽ rất dễ dàng để đánh dấu các tệp lưu trữ là -w vì vậy đây sẽ là những gì tôi làm. Và các tệp làm việc bên ngoài các thư mục lưu trữ có thể được giữ nguyên, vì vậy nếu tôi chạy chương trình cập nhật vào ban ngày thì nó vẫn sẽ sao chép các tệp đang thực hiện. Đây chính xác là những gì tôi đang tìm kiếm. TNX nhiều!
SDsolar

4

Không có câu trả lời chính xác về cách thực hiện điều này với SCP, vì đó là những gì câu hỏi ban đầu đang hỏi.

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r username@server.com:/file/location/* /files

Khi hoàn tất việc sao chép các tệp sẽ thay đổi các quyền trở lại:

sudo chmod a+w -R /files


1
Vâng, có thể nói, câu hỏi ban đầu là "làm thế nào tôi có thể giải quyết vấn đề này", mà rsync là câu trả lời.
Edward Falk
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.