Linux làm sao để sao chép nhưng không ghi đè?


385

Tôi muốn vào cpmột thư mục nhưng tôi không muốn ghi đè lên bất kỳ tệp nào hiện có ngay cả khi chúng cũ hơn các tệp đã sao chép. Và tôi muốn làm điều đó hoàn toàn không tương tác vì đây sẽ là một phần của tập lệnh Crontab Bash. Có ý kiến ​​gì không?


Câu trả lời:


589

Lấy từ trang người đàn ông :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Thí dụ:

cp -n myoldfile.txt mycopiedfile.txt

32
Lưu ý, điều này sẽ thoát với một lỗi nếu tập tin tồn tại. Để thoát thành công, hãy thử cp -n source.txt destination.txt || true
galenandrew

13
@galenandrew cp -nkhông thoát khi có lỗi nếu tệp tồn tại trên Ubuntu 12.04.
amit

@galenandrew Khẳng định. Cảm ơn bạn. Dự án của tôi không được xây dựng trong Xcode sau khi thêm tập lệnh chạy vào mục tiêu của tôi.
Ruiz

@AaronFranke trông giống như nó.
Boris

93

Cân nhắc sử dụng rsync.

rsync -a -v --ignore-existing src dst

Theo nhận xét rsync -a -v src dstlà không chính xác bởi vì nó sẽ cập nhật các tập tin hiện có.


7
Bạn muốn thêm --ignore-existingcờ để ngăn các tệp hiện có bị ghi đè.
Tất cả công nhân đều cần thiết vào

7
Lệnh hoàn chỉnh rsync -a -v --ignore-existing <src> <dst>thực sự là câu trả lời chính xác, thay vì cp -uở trên.
Whitebird

Nếu một bản sao trước đó bị gián đoạn và chỉ sao chép một tập tin bị cắt, tôi chắc chắn cp -u sẽ không sao chép lại ... nhưng sẽ rsync, với --ignore tồn tại? Có lẽ không phải ... vì vậy mà làm cho chúng hoàn toàn tương đương, phải không?
dagelf 16/12/17

rsync giữ dấu thời gian của tệp trong khi cp sử dụng thời gian hiện tại (theo kinh nghiệm của tôi)
Stefan Diabo

1
một số máy chủ không có rsync
mebada

51
cp -n

Là những gì bạn muốn. Xem trang người đàn ông.


@AaronFranke vâng, nó sẽ hoạt động đệ quy.
Boris

33

Điều này sẽ hoạt động trên RedHat:

false | cp -i source destination 2>/dev/null

Cập nhậtkhông ghi đè là một cái gì đó khác nhau.


4
Làm gì falseở đây?
Ngọn lửa đông lạnh

11
@F FrozenFlame Trả lời -icâu hỏi.
ceving

Rõ ràng, lệnh này sẽ không hoạt động nếu bạn cố gắng sao chép nhiều hơn các tệp ARG_MAX. Để giải quyết vấn đề này, hãy kiểm tra liên kết này .
mginius

2
Rõ ràng, lệnh này sẽ không hoạt động nếu trái đất đâm vào mặt trời.
ceving

32

Đối với những người thấy rằng không có tùy chọn 'n' (như tôi trên RedHat), bạn có thể sử dụng cp -uđể chỉ ghi tệp nếu nguồn mới hơn nguồn hiện có (hoặc không có sẵn).

[sửa] Như đã đề cập trong các bình luận, điều này sẽ ghi đè lên các tệp cũ hơn, do đó không chính xác là những gì OP muốn. Sử dụng câu trả lời của ceving cho điều đó.


11
OP yêu cầu không ghi đè lên các tệp hiện có ngay cả khi chúng cũ hơn các tệp được sao chép , vì vậy -ukhông thực sự phù hợp với mục đích.
Andrew Lott

4
Trời ơi, bạn hoàn toàn đúng. Tôi ngạc nhiên khi mọi người chú ý đến nó.
Grim ...

Nó có thể không phải là những gì OP yêu cầu, nhưng đó chính xác là những gì tôi cần cho Không gian của tôi (Centos 7). Cảm ơn!
Thomas Praxl

Tôi vui mừng sáu năm trước tôi có thể giúp :-D
Grim ...

10

Alpine linux: Câu trả lời dưới đây chỉ dành cho trường hợp của một tệp duy nhất: trong alpine cp -nkhông hoạt động (và false | cp -i ...quá) vì vậy giải pháp hoạt động trong trường hợp của tôi mà tôi tìm thấy là:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

Trong ví dụ trên nếu env.jstập tin không tồn tại thì chúng tôi sao chép env.example.jsvào env.js.


1

Một số phiên bản của cp không có tùy chọn --no-clobber . Trong trường hợp đó:

  echo n | cp -vipr src/* dst
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.