Tại sao find -mtime +1 chỉ trả về các tệp cũ hơn 2 ngày?


117

Tôi đang đấu tranh để suy nghĩ về lý do tại sao các findphiên dịch sửa đổi tập tin lần. Cụ thể, tôi không hiểu tại sao các -mtime +1tệp không hiển thị dưới 48 giờ.

Như một thử nghiệm mẫu, tôi đã tạo ba tệp thử nghiệm với các ngày được sửa đổi khác nhau:

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

Sau đó tôi chạy find với -mtime +1switch và nhận được kết quả sau:

[root@foobox findtest]# find -mtime +1
./foo3

Sau đó tôi chạy tìm với -mmin +1440và nhận được kết quả như sau:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

Theo trang người đàn ông để tìm, tôi hiểu rằng đây là hành vi dự kiến:

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

Điều này vẫn không có ý nghĩa với tôi mặc dù. Vì vậy, nếu một tệp là 1 ngày, 23 giờ, 59 phút và 59 giây, hãy find -mtime +1bỏ qua tất cả những thứ đó và chỉ xử lý nó như 1 ngày, 0 giờ, 0 phút và 0 giây? Trong trường hợp nào, nó không phải là kỹ thuật cũ hơn 1 ngày và bỏ qua?

Có ... không ... tính toán.


7
Lúc đầu, nó có vẻ buồn cười đối với tôi, nhưng khi bạn xem xét rằng nó đo tuổi của tệp theo ngày nguyên, thì nó thực hiện chính xác những gì bạn mong đợi. Nó sẽ không cung cấp cho các tập tin bằng 1 ngày tuổi. Một tệp có tuổi (1,99) ngày không> 1.
Bạch tuộc

Câu trả lời:


87

Chà, câu trả lời đơn giản là, tôi đoán rằng việc triển khai tìm kiếm của bạn đang tuân theo tiêu chuẩn POSIX / SuS, nói rằng nó phải hành xử theo cách này. Trích dẫn từ phiên bản SUSv4 / IEEE Std 1003.1, 2013, "tìm" :

-mtime n
     Chính sẽ đánh giá là đúng nếu thời gian sửa đổi tệp được trừ
     vào thời gian khởi tạo, chia cho 86400 (với bất kỳ phần còn lại nào bị loại bỏ), là n.

(Ở những nơi khác trong tài liệu đó, nó giải thích điều đó nthực sự có thể +n, và ý nghĩa của điều đó là "lớn hơn").

Là tại sao tiêu chuẩn nói nó sẽ cư xử như vậy-well, tôi đoán dài trong quá khứ một lập trình viên là lười biếng hoặc không suy nghĩ về nó, và chỉ cần viết mã C (current_time - file_time) / 86400. Số nguyên C loại bỏ phần còn lại. Các kịch bản bắt đầu tùy thuộc vào hành vi đó, và do đó nó được chuẩn hóa.

Hành vi cụ thể cũng sẽ được chuyển đến một hệ thống giả định chỉ lưu trữ ngày sửa đổi (không phải thời gian). Tôi không biết nếu một hệ thống như vậy đã tồn tại.


3
Tìm được thiết kế rõ ràng để làm công việc dọn dẹp mà thôi.
Kjeld Flarup

84

Đối số -mtimeđược hiểu là số ngày trong độ tuổi của tệp. -mtime +ncó nghĩa là nghiêm ngặt lớn hơn , -mtime -ncó nghĩa là nghiêm ngặt ít hơn.

Lưu ý rằng với Bash, bạn có thể thực hiện trực quan hơn:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

để tìm các tập tin cũ hơn và mới hơn 24 giờ, tương ứng.

(Nó cũng dễ hơn so với việc nhập một đối số phân số để -mtimekhi bạn muốn giải quyết trong vài giờ hoặc vài phút.)


2
Để liệt kê các tệp đó (chỉ thông thường) với kích thước có thể đọc được của con người và theo thứ tự thời gian, hãy làm$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev

1
Điều này cũng sẽ có tác dụng tương tự ở chỗ cả hai lệnh đó cùng nhau sẽ vẫn bỏ lỡ các tệp bên trong cửa sổ một phút đó 24 giờ trước.
Bạch tuộc

1
$(())là cú pháp số học shell đơn giản, nó không đặc trưng cho Bash, cf pubs.opengroup.org/onlinepub/009695399/utilities/
Josip Rodin

@JosipRodin Không, không hẳn đúng! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Vì Bash là một SH "mở rộng", nó hỗ trợ cú pháp này, nhưng một số shell khác thì không, ví dụ như csh / tcsh.
t0r0X

@ t0r0X Quan điểm của tôi là nó không phải là một bashism, thay vào đó, nó hoạt động trong dash và zsh và bất cứ điều gì khác phục vụ như bình thường /bin/sh.
Josip Rodin

45

Phân số thời gian 24 giờ được cắt ngắn! Điều đó có nghĩa là, lượt tìm kiếm của +1 -mtime +1 nói phù hợp với các tệp được sửa đổi hai ngày trở lên.

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

Điều sau đây chỉ có thể hoạt động trên GNU?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

Cảm ơn, tôi đã cố gắng tìm hiểu tại sao -mtime X khác với -mtime + X
Vnge

Tôi cho rằng + X có nghĩa là quần short cho (X + 1, X + 2, X + 3, ...). :)
Eric Zheng

18

Vì vậy, nếu một tệp là 1 ngày, 23 giờ, 59 phút và 59 giây, hãy tìm thời gian +1 bỏ qua tất cả những điều đó và chỉ xử lý nó như 1 ngày, 0 giờ, 0 phút và 0 giây?

Đúng. Giống như man findnói, "bất kỳ phần phân số được bỏ qua". Nếu bạn chia "1 ngày, 23 giờ, 59 phút và 59 giây" cho đến "24 giờ", bạn có thể nhận được 1.9999, nhưng phần 0,9999 sau đó bị tước và đột nhiên tệp chỉ còn 1 ngày.


18

-mtime Nnghĩa là các tệp có tuổi A tính theo ngày thỏa mãn NA < N +1. Nói cách khác, chọn các tệp được sửa đổi lần cuối giữa NN +1 ngày trước.-mtime N

-mtime -Ncó nghĩa là các tệp có tuổi A thỏa mãn A < N , tức là các tệp được sửa đổi ít hơn N ngày trước. Ít trực quan hơn, có nghĩa là các tệp có tuổi A thỏa mãn N +1 A , tức là các tệp được sửa đổi ít nhất N +1 ngày trước.-mtime +N

Ví dụ: -mtime 1chọn các tệp đã được sửa đổi từ 1 đến 2 ngày trước. -mtime +1chọn các tệp đã được sửa đổi ít nhất 2 ngày trước. Để có được các tập tin sửa đổi ít nhất 1 ngày trước, sử dụng -mtime +0.

Mô tả đã được sửa đổi lần cuối n * 24 giờ trước đây chỉ là một xấp xỉ và không rõ ràng lắm.

Nếu bạn thấy những quy tắc này khó nhớ, hãy sử dụng tệp tham chiếu thay thế.

touch -d '1 day ago' cutoff
find . -newer cutoff

(Cú pháp của 1 ngày trước đây yêu cầu GNU touch.)


3
Giải thích hay, 3 đoạn đầu nên được thêm vào tài liệu của find!
Melebius

4

Sử dụng -mmin, -amin, v.v để có kết quả chính xác


6
Các -?minđối số hoạt động chính xác như các -?timeđối số ngoại trừ với phút thay vì ngày. Họ cũng không chính xác.
Gilles

-2

Nếu bạn muốn các tệp chính xác 48 giờ, không phải 2 ngày, thì bạn nên thêm --daystartvào findlệnh của mình . Điều này sẽ giúp bạn.

find . type -f -daystart -mtime +1

5
Không, đầu tiên, nó -daystart(một phần mở rộng GNU), không phải --daystart. Sau đó, -daystartchỉ có nghĩa là so sánh thời gian với đầu ngày hôm nay thay vì thời gian hiện tại, do đó, --daystart -mtime +1sẽ báo cáo các tệp đã được sửa đổi hơn 48 giờ / 2 giờ trước khi bắt đầu ngày hôm nay, vì vậy, thường là các tệp được sửa đổi một cách khéo léo trước ngày hôm trước .
Stéphane Chazelas
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.