Sao chép mọi tệp trong cấu trúc thư mục vào đường dẫn cụ thể chỉ khi tệp chưa tồn tại ở đó


8

Chỉ muốn sao chép mọi tệp từ cấu trúc thư mục sang một thư mục cụ thể chỉ khi tệp chưa tồn tại ở đó.

Có phần đầu tiên từ câu hỏi Stack Overflow này :

find . -type f -exec cp {} /target-directory \;

Làm thế nào tôi có thể kiểm tra nếu tập tin tồn tại hay không? Nếu không, sao chép các tập tin, nếu không bỏ qua.


Bạn có nghĩa là "sao chép tất cả các tệp trong cây nguồn vào một thư mục (cụ thể) không có thư mục con"? Hoặc "sao chép tất cả các tệp trong cây nguồn vào thư mục con của thư mục đích tương tự như vị trí của nó trong cây nguồn"? Tôi đọc câu hỏi như trường hợp đầu tiên - bạn có thể chỉnh sửa câu hỏi để làm rõ không? (Tôi biết bạn có câu trả lời của mình, nhưng nó sẽ được đọc và sử dụng bởi những người khác.)
Volker Siegel

Câu trả lời:


13

Bạn có thể sử dụng -uchuyển đổi từ cplệnh:

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

hoặc sử dụng rsynclệnh với --ignore-existing:

bỏ qua việc cập nhật các tập tin tồn tại trên máy thu

Thí dụ:

rsync --ignore-existing source/* destination/

3

Lệnh ban đầu của bạn có thể được viết lại thành:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

Chìa khóa ở đây là chúng ta gọi shell với các lệnh cụ thể và truyền tệp tìm thấy làm $1đối số. Nếu test -e /target-directory/"$1"thất bại, điều đó có nghĩa là tệp không tồn tại, trong trường hợp đó cpsẽ sao chép tệp.

Nói chung, người ta có thể sử dụng các lệnh khác, miễn là lệnh có thể xác minh sự tồn tại của một tệp. Một số lựa chọn thay thế khác:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
Tại sao statphải kiểm tra sự tồn tại của tệp trong Bash? Sẽ không test -eđơn giản hơn nhiều?
David foerster

@DavidFoerster Không có lý do cụ thể. lệnh kiểm tra sẽ làm quá. Tôi sẽ chỉnh sửa câu trả lời của mình sau nếu tôi không quên
Sergiy Kolodyazhnyy

0

Đọc man cpvà sử dụng --no-clobbertùy chọn để cp.

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.