scp mà không thay thế các tập tin hiện có ở đích


158

Làm cách nào để sao chép toàn bộ thư mục vào thư mục cùng tên mà không thay thế nội dung trong thư mục đích? (thay vào đó, tôi muốn thêm vào nội dung của thư mục đích)


Vâng, đó gây phiền nhiễu khi một chương trình hữu ích / tiện ích không có một rằng "nếu chỉ nó có thể ..." tùy chọn! Trong trường hợp này "--noclobber"!
MikeW

Câu trả lời:


139

Sử dụng rsyncvà vượt qua -unếu bạn muốn chỉ cập nhật các tệp mới hơn trong thư mục gốc hoặc --ignore-existingbỏ qua tất cả các tệp đã tồn tại ở đích.

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

(Lưu ý /về phía nguồn: không có nó rsyncsẽ tạo ra /remote/directory/directory.)


@Anthon Tôi không hiểu bình luận của bạn và tôi không thấy câu trả lời hoặc bình luận của chandra. --ignore-existingkhông thêm mà không thay thế, bạn thấy mất dữ liệu gì?
Gilles

Xin lỗi, tôi chỉ xem ví dụ đầu tiên của bạn đó là nơi bạn có thể bị mất dữ liệu (và IMHO không phải là những gì OP yêu cầu), nếu bạn bao gồm - mất dữ liệu hiện có - không nên xảy ra.
Anthon

Điều này không hữu ích nếu hệ thống từ xa không có rsyncsẵn dễ dàng .... (Giống như Win32-OpenSSH)
Gert van den Berg

@GertvandenBerg rsync khá dễ cài đặt trên Windows, không khó hơn SSH.
Gilles

@Gilles: Đúng, nhưng tất cả các tùy chọn dường như liên quan đến DLL Cygwin ... (Trạng thái hiện tại của cổng MS của OpenSSH là cho phép nén trên scp là đủ để phá vỡ SCP ...) (Nhận chức năng rsync trên Win32 -OpenSSH cũng có vẻ không tầm thường - hy vọng điều đó sẽ cải thiện theo thời gian) (Solaris 10 là ví dụ khác, trong đó cần có gói bên thứ ba --rsync-path)
Gert van den Berg

82

scp sẽ ghi đè lên các tập tin nếu bạn có quyền ghi vào chúng.

Nói cách khác: Bạn có thể thực hiện scpbỏ qua các tệp đã nói một cách hiệu quả bằng cách tạm thời xóa quyền ghi trên chúng (nếu bạn là chủ sở hữu của tệp, nghĩa là).


5
Cảm ơn vì điều đó. Chính xác là mẹo tôi đang tìm kiếm.
sacarine

đảm bảo bạn sao chép các tập tin trở lại, bạn thêm dấu * để làm như vậy. Ví dụscp -r user@server.com:/location/of/files/* /local/location/
Rick

1
tìm thấy . -type f -exec chown root: root {} \;
ling

1
Trong trường hợp không phổ biến, chỉ một số tệp trong thư mục dự kiến ​​sẽ bị ghi đè (nếu không được "bảo vệ") và quyền truy cập tệp không đồng nhất trên các tệp, giải pháp này có thể không hoạt động. Nếu không, nó khá đơn giản và hiệu quả.
sancho.s

Để thực hiện việc này trên windows, chọn tất cả các tệp, nhấp chuột phải -> thuộc tính -> chỉ đọc
BenJammin

12

Bạn chỉ có thể sao chép các tập tin mới theo ngày. Sử dụngfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

có nghĩa là gì?
Francis Kim

@FrancisKim có nghĩa là sửa đổi 7 ngày trước. Vì vậy, truy vấn này chọn bất kỳ tệp * .gz nào được sửa đổi trong vòng 7 ngày qua
Vadim Eremeev

4
Không phải +7 thực sự ngụ ý hơn 7 ngày trước sao?
Jeff H.

1
Vâng, nó có nghĩa là "hơn 7 ngày trước". Không biết ai đã ủng hộ điều này.
Stefan Reich

9

Nếu bạn có thể làm cho nội dung tệp đích chỉ đọc:

find . -type f -exec chmod a-w '{}' \;

trước khi chạy scp(nó sẽ khiếu nại và bỏ qua các tập tin hiện có).

Và thay đổi chúng trở lại sau đó ( chmod +wđể có được giá trị dựa trên umask). Nếu tất cả các tệp không có quyền ghi theo ô của bạn, bằng cách nào đó bạn sẽ phải lưu trữ các quyền để bạn có thể khôi phục chúng.

(Câu trả lời của Gilles ghi đè lên các tệp hiện có nếu cục bộ chúng mới hơn, tôi đã mất dữ liệu có giá trị theo cách đó. Không hiểu tại sao câu trả lời sai và có hại đó lại có quá nhiều phiếu bầu).


2
Tôi không hiểu: làm thế nào rsync --ignore-existingkhiến bạn mất dữ liệu?
Gilles

4
Tôi đã gặp lỗi khi find: missing argument to '-exec'sử dụng lệnh này và thay vào đó phải sử dụng : find . -type f -exec chmod a-w {} \;. Linux của tôi là xấu, ymmv.
wpearse

Đây là một câu trả lời tốt hơn và an toàn hơn. Lệnh chính xác để thay đổi quyền là như @wpearse đã đề cập:find . -type f -exec chmod a-w {} \;
Amir

6

Tôi đã có một nhiệm vụ tương tự, trong trường hợp của tôi, tôi không thể sử dụng rsync, csynchoặc FUSE vì lưu trữ của tôi chỉ có SFTP. rsynckhông thể thay đổi ngày và giờ cho tệp, một số tiện ích khác (như csync) hiển thị cho tôi các lỗi khác: " Không thể tạo tệp tạm thời Đồng hồ bị lệch phát hiện ".

Nếu bạn có quyền truy cập vào máy chủ lưu trữ - chỉ cần cài đặt openssh-serverhoặc khởi chạy rsyncnhư một trình nền tại đây.

Trong trường hợp của tôi - tôi không thể làm điều này và giải pháp là: lftp . lftpCách sử dụng để đồng bộ hóa là dưới đây:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder- là thư mục trên PC của tôi, /rem/folder- là sftp://sft.domain.tld/rem/folder.

Bạn có thể tìm thấy các trang man theo liên kết: http://lftp.yar.ru/lftp-man.html


6

Để sao chép toàn bộ tập tin, nhanh hơn để tar chúng. Bằng cách sử dụng -k, bạn cũng ngăn tar ghi đè các tệp khi giải nén nó trên hệ thống đích.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
Nó thực hiện một kết nối từ xa. Đầu tiên, nó là nguồn, đưa nó vào kết nối ssh và giải nén nó trên hệ thống từ xa.
huembi

-1

scpkhông ghi đè lên các tệp và không có công tắc nào để ngăn chặn việc đó, nhưng bạn có thể sao chép mọi thứ theo cách đó, thực hiện scp và sau đó sao chép các tệp hiện có. Ví dụ:

  1. Sao chép tất cả các tệp hiện có theo cách

    mkdir original_files ; cp -r * original_files/
    
  2. Sao chép mọi thứ bằng scp

    scp -r user@server:dir/* ./
    
  3. Sao chép các tập tin gốc trên bất cứ điều gì scp đã viết qua:

    cp -r original_files/* ./
    

3
Phương pháp này không hữu ích khi bạn đang cố gắng kéo các tập tin từ xa và chọn nơi bạn rời đi. Tức là nếu toàn bộ mục đích là để tiết kiệm thời gian.
Oliver Williams

-1

Một cách khác để đạt được điều này là thực hiện lstrên thư mục đích:

Trên thư mục đích từ xa:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

Về nguồn:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

Về đích:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

Xin đừng làm điều này. 1. Đừng phân tích ls . 2. Câu trả lời là nguy hiểm nếu bất kỳ tên tệp nào chứa - >dòng mới không gian hoặc các ký tự đặc biệt khác. 3. Mã cứng một vòng lặp for trong tập lệnh python. Tạo một chương trình trong thời gian chạy là khó khăn và khó khăn (ngay cả khi được thực hiện bởi các lập trình viên chuyên nghiệp), vì rất nhiều lý do. Tạo một kịch bản shell thậm chí còn tồi tệ hơn - một ý tưởng khủng khiếp.
Ignis
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.