sao chép tập tin sửa đổi sau ngày cụ thể bằng cách sử dụng chuyển đổi cp


7

Khi tôi thực thi lệnh, find . -mtime -60tôi nhận được danh sách các tệp được sửa đổi trong vòng 60 ngày qua.

Vì vậy, khi tôi thực thi, find . -mtime -60 -exec cp {} /tmp/1 \;tôi có thể sao chép các tệp này vào một thư mục mới để xử lý

Tuy nhiên nếu tôi muốn duy trì dấu thời gian, tôi không thể sao chép chỉ các tệp cần thiết khi tôi thực thi find . -mtime -60 -exec cp -LR --preserve=timestamps {} /tmp/2 \;

Điều cuối cùng xảy ra là TẤT CẢ các tệp trong thư mục nguồn được sao chép thay vì chỉ các tệp tôi cần.

Có giải pháp nào ở đây không?


1
Thật thú vị, tôi đã trả lời gần như chính xác cùng một câu hỏi vào đầu ngày hôm nay - unix.stackexchange.com/questions/118394/ợi
Graeme

Câu trả lời:


11

Điều đang xảy ra ở đây là khi bạn sử dụng -Rtùy chọn cpvà cung cấp một thư mục làm đối số, nó sẽ sao chép mọi thứ trong thư mục đó. Hơn nữa, điều này sẽ không bảo vệ cấu trúc thư mục vì bất kỳ tệp nào trong các thư mục thấp hơn sẽ được sao chép trực tiếp vào /tmp/2. Đây có thể là những gì bạn muốn (xem câu trả lời của X Tian để biết cách thực hiện theo cách này), nhưng hãy cẩn thận nếu bất kỳ tệp nào có cùng tên, người ta sẽ ghi đè lên người khác khi bị giam giữ.

Để bảo vệ cấu trúc thư mục, bạn có thể sử dụng cpio:

find . -mtime -60 -print0 | cpio -0mdp /tmp/2

Nếu -0tùy chọn (hoặc tương đương) không khả dụng, bạn có thể thực hiện việc này, nhưng hãy cẩn thận, không có tên tệp nào của bạn chứa dòng mới:

find . -mtime -2 | cpio -mdp /tmp/2

cpiocũng nên hỗ trợ -Ltùy chọn, mặc dù hãy cẩn thận với điều này vì trong một số trường hợp nó có thể gây ra một vòng lặp vô hạn.


2

Bạn nên loại trừ các thư mục, tập tin tìm bản in đầu tiên .ngoài ra bạn sử dụng tùy chọn đệ quy trên bản sao.

Vì vậy, sau đây là nhiều hơn những gì bạn dự định, tuy nhiên như Graeme chỉ ra, cpio -pdmsẽ bảo tồn cấu trúc thư mục gốc, cpsẽ chỉ sao chép vào thư mục đích.

find . -mtime -60 -type f -exec cp -Lv --preserve=timestamps {} /tmp/2 \;

Tôi sẽ để lại câu trả lời này để làm nổi bật sự khác biệt giữa Graeme và giải pháp này. Vì tôi nghĩ rằng nó thêm một cái gì đó vào câu trả lời tổng thể cho câu hỏi ban đầu. Những người đọc khác có thể thấy điều này thú vị.


Bạn nên sử dụng tốt hơn +thay vì \;những gì bạn đang làm sẽ gọi một cptệp cho mỗi tệp, điều này là không cần thiết. Ngoài ra, điều này sẽ không bảo vệ cấu trúc thư mục và có thể dẫn đến một số tệp ghi đè lên nhau nếu chúng có cùng tên.
Graeme

Nhận xét tuyệt vời, Bạn hoàn toàn chính xác trên cả 3 tài khoản. Tôi sẽ cập nhật chỉ để làm nổi bật lỗi đệ quy, thư mục.
X Tian

1

Điều này bảo tồn dấu thời gian trên các thư mục và tệp:

find . -mtime -60 -type f -exec cp --parents -fuav {} /tmp/2 \;

Đã thử nghiệm bằng CentOS 7.2.

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.