Sao chép tệp trong Linux, tránh sao chép nếu tệp tồn tại ở đích


32

Tôi cần sao chép thư mục / home / user từ đĩa cứng này sang đĩa khác. Nó có 100.000 tệp và kích thước khoảng 10G.

tôi sử dụng

cp -r /origin /destination

đôi khi tôi nhận được một số lỗi do liên kết bị hỏng, quyền và như vậy. Vì vậy, tôi sửa lỗi, và cần phải bắt đầu lại bản sao.

Tôi tự hỏi làm thế nào tôi có thể nói với lệnh "cp", một khi nó cố gắng sao chép lại, không sao chép lại các tập tin nếu chúng tồn tại trong thư mục đích.


2
Đừng chúng tôi cp. Sử dụng rsync thay thế.
William Pursell

Câu trả lời:


22

cp -R -u -p /source /destination

Các -u( hoặc--update ) cờ chỉ này:

Từ trang man cho cp:

-u, - cập nhật

chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu


6
Để chỉ sao chép các tệp không tồn tại và không cập nhật các tệp hiện có, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, --update chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu -u, - chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu -p giống như --preserve = mode, quyền sở hữu, dấu thời gian --preserve [= ATTR_LIST] giữ nguyên các thuộc tính được chỉ định (mặc định: chế độ, quyền sở hữu, tem thời gian), nếu có thể các thuộc tính bổ sung: bối cảnh, liên kết, xattr, tất cả
Covich

51

Chỉ cần sử dụng cp -n <source> <dest>.

Từ trang nam :

-n, --no-clobber

KHÔNG ghi đè lên tệp hiện có (ghi đè tùy chọn -i trước đó)


7
Đây là câu trả lời đúng duy nhất cho câu hỏi.
sebix

20

rsync -aq /src /dest

Ngoài việc chỉ sao chép các tệp mới hơn, nó thậm chí sẽ chỉ sao chép các phần mới hơn của tệp nếu tệp đã thay đổi. Nó nhằm mục đích sao chép qua các liên kết mạng nơi bạn muốn giảm thiểu lượng dữ liệu - nhưng nó cũng hoạt động rất tốt tại địa phương.


Tôi không thể thêm định dạng `` vào bài viết của bạn vì nó chỉ có hai ký tự. Bạn cảm thấy thế nào về việc chỉnh sửa điều này và thêm các ký tự `` xung quanh lệnh của bạn?
thúc

4

Tra cứu tùy chọn "-u" cho cplệnh.


2
Không đồng ý rằng sử dụng -u là một ý tưởng tốt. -u chỉ sao chép khi nguồn mới hơn hoặc đích bị thiếu. Vấn đề ban đầu của người đăng là do phá vỡ sao chép tập tin vì lý do nào. Do đó, OP sẽ có một nửa tập tin chưa được cập nhật khi chạy lại bản sao. Tập tin đó có thể quan trọng đối với ai đó! rsync giải quyết vấn đề này.
hazymat

2

Tất cả các câu trả lời trên đều đúng nhưng nếu bạn đang làm điều này một cách đệ quy thì

bạn nên làm:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Bạn nên sao chép dưới dạng root để duy trì quyền / quyền sở hữu

# cp -au

Cũng nhìn vào rsync


1

Giải pháp POSIX

Câu trả lời khác sử dụng -u hoặc -ntùy chọn của cp. Cả hai điều này đều không được POSIX yêu cầu ; cũng không phải là rsynctừ một câu trả lời khác; cũng không được yessử dụng trong một trong những ý kiến.

Tuy nhiên, chúng ta có thể tái tạo yes nvới một whilevòng lặp. Điều này dẫn đến giải pháp POSIX sau:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Sử dụng cp -rn <sourcedirname>/. <destdirname>

Công tắc r làm cho bản sao đệ quy trên các thư mục.

Công tắc n (phiên bản dài không có clobber) đảm bảo các tệp hiện có không bao giờ bị ghi đè.

' /.' Sau tên sourcedir đảm bảo rằng nó không trở thành thư mục con dưới tên định mệnh thay vì tất cả nội dung của cái trước được sao chép sang cái sau.

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.