2011-06-30 25 views
28

Tôi biết có tùy chọn này cho lệnh find unix của:UNIX find: đối diện với tùy chọn -newer tồn tại?

find -version 
GNU find version 4.1 

    -newer file Compares the modification date of the found file with that of 
     the file given. This matches if someone has modified the found 
     file more recently than file. 

Có một lựa chọn mà sẽ cho phép tôi tìm thấy tập tin được hơn một tập tin nhất định. Tôi muốn xóa tất cả các tệp khỏi thư mục để dọn dẹp. Vì vậy, một thay thế mà tôi sẽ tìm thấy tất cả các tập tin cũ hơn N ngày sẽ làm công việc quá.

Trả lời

32

Bạn có thể sử dụng một ! phủ nhận hoạt động -newer như thế này:

find . \! -newer filename 

Nếu bạn muốn tìm tập tin đã được sửa đổi nhiều sau đó 7 ngày trước sử dụng cuối cùng:

find . -mtime +7 

CẬP NHẬT:

Để tránh khớp với tệp bạn đang so sánh với việc sử dụng các mục sau:

find . \! -newer filename \! -samefile filename 
+1

Điều quan trọng cần lưu ý rằng logic này sẽ là "bằng hoặc lớn hơn". Vì vậy, nó sẽ bao gồm các tập tin tham khảo nếu nó trong đường dẫn. Xem, câu trả lời của marty dưới đây cho một giải pháp tốt hơn. – swdev

+0

Câu trả lời của Marty cũng sẽ ngăn không khớp các tệp có cùng tên với tệp thử nghiệm. Tôi đã cập nhật câu trả lời của mình với thử nghiệm loại trừ tệp đang được thử nghiệm. – qbert220

6

Bạn chỉ có thể sử dụng phủ định:

find ... \! -newer <reference> 

Bạn cũng có thể thử các gia đình -mtime/-atime/-ctime/-Btime các tùy chọn. Tôi không nhớ ngay cách chúng hoạt động, nhưng chúng có thể hữu ích trong tình huống này.

Cẩn thận với việc xóa tệp khỏi hoạt động find, đặc biệt là thao tác đang chạy dưới dạng gốc; có rất nhiều cách mà quy trình độc hại, không có đặc quyền trên cùng một hệ thống có thể đánh lừa nó vào việc xóa những thứ bạn không muốn xóa. Tôi khuyên bạn nên đọc toàn bộ phần "Deleting Files" của GNU find manual.

2

Xin lưu ý, đó là sự phủ định của phương tiện mới "lớn tuổi hoặc cùng timestamp":

Như bạn thấy trong ví dụ này, cùng một tập tin cũng trở:

[email protected]:/home/thomas/tmp/ touch test 
[email protected]:/home/thomas/tmp/ find ./ ! -newer test 
./test 
4

Nếu bạn chỉ cần file đó lớn tuổi hơn tập tin "foo" và không foo chính nó, loại trừ các tập tin bằng cách sử dụng tên phủ:

find . ! -newer foo ! -name foo 
1

Thật không may, tìm doesnt hỗ trợ này! -newer không có nghĩa là cũ hơn. Nó chỉ có nghĩa là không mới hơn, nhưng nó cũng phù hợp với các tập tin có thời gian sửa đổi bằng nhau. Vì vậy, tôi thích sử dụng

for f in path/files/etc/*; do 
    [ $f -ot reference_file ] && { 
     echo "$f is older" 
     # do something 
    } 
done 
Các vấn đề liên quan