Cách tốt nhất để đồng bộ hóa các tệp - chỉ sao chép các tệp EXISTING và chỉ khi MỚI hơn mục tiêu


18

Tôi đang thực hiện đồng bộ hóa cục bộ này trên Ubuntu 12.04. Các tệp nói chung là các tệp văn bản nhỏ (mã).

Tôi muốn sao chép (bảo quản tem mtime) từ sourcethư mục sang targetnhưng tôi chỉ muốn sao chép nếu tệp trong đó target đã tồn tại hơn tệp trong source.

Vì vậy, tôi chỉ sao chép các tệp mới hơn source, nhưng chúng phải tồn tại targethoặc chúng sẽ không được sao chép. ( sourcesẽ có nhiều tệp hơn target.)

Tôi thực sự sẽ được sao chép từ sourcenhiều targetthư mục. Tôi đề cập đến điều này trong trường hợp nó tác động đến sự lựa chọn giải pháp. Tuy nhiên, tôi có thể dễ dàng chạy lệnh của mình nhiều lần, chỉ định lệnh mới targetmỗi lần, nếu đó là điều bắt buộc.

Câu trả lời:


29

Tôi tin rằng bạn có thể sử dụng rsyncđể làm điều này. Quan sát chính sẽ cần sử dụng --existingvà các --updatecông tắc.

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

Một lệnh như thế này sẽ làm điều đó:

$ rsync -avz --update --existing src/ dst

Thí dụ

Nói rằng chúng tôi có dữ liệu mẫu sau.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

Có vẻ như sau:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

Bây giờ nếu tôi đồng bộ hóa các thư mục này thì sẽ không có gì xảy ra:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

Nếu chúng ta touchlà một tệp nguồn để nó mới hơn:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

Một rsynclệnh khác của lệnh:

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

Chúng ta có thể thấy rằng file3, vì nó mới hơn và nó tồn tại dst/, nên nó được gửi đi.

Kiểm tra

Để đảm bảo mọi thứ hoạt động trước khi bạn cắt lệnh lỏng lẻo, tôi khuyên bạn nên sử dụng rsynccác công tắc khác , --dry-run. Chúng ta hãy thêm một đầu ra -vnữa để rsyncđầu ra dài dòng hơn.

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Cảm ơn bạn. Tôi không cần thêm một vài tùy chọn rsync? Tôi đang đọc trang đàn ông. Có vẻ như tôi có thể cần điều này : rsync --archive --update --existing --whole-file --itemize-changes a/ b. Hoặc hầu hết các tùy chọn không cần thiết? (Tôi đã thêm toàn bộ tệp vì đây hầu hết là các tệp văn bản nhỏ.)
MountainX cho Monica Cellio

@MaxX - chỉ thêm tùy chọn bạn cần. Tôi sẽ bắt đầu với -ađó là một bộ siêu công tắc , -rlptgoD.
slm

Hãy để tôi làm rõ điều đó. Tôi bối rối về --update--existing. Tôi có cần cả hai không? Tôi đã thử nghiệm giải pháp của bạn và nó có vẻ hiệu quả, nhưng tôi vẫn cảm thấy an toàn hơn khi thêm vào --update.
MountainX cho Monica Cellio

@MaxX - chắc chắn bạn có thể thêm nó vào, tôi cũng sẽ đặt nó vào A.
slm
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.