find -mtime +1이 2일 전의 파일만 반환하는 이유는 무엇입니까?

find -mtime +1이 2일 전의 파일만 반환하는 이유는 무엇입니까?

마음을 비우려고 노력 중이야find파일 수정 시간을 해석하는 방법. 특히 -mtime +148시간이 지난 파일은 왜 표시되지 않는지 이해할 수 없습니다 .

샘플 테스트로 수정 날짜가 다른 세 가지 테스트 파일을 만들었습니다.

[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

그런 다음 스위치를 사용하여 find를 실행 -mtime +1하고 다음과 같은 출력을 얻었습니다.

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

그런 다음 find를 실행하여 -mmin +1440다음과 같은 결과를 얻었습니다.

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

find의 매뉴얼 페이지에 따르면 이것이 예상되는 동작이라는 것을 알고 있습니다.

 -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.

그러나 그것은 여전히 ​​나에게 이해가 되지 않습니다. 그러면 파일이 1일 23시간 59분 59초가 지난 경우 find -mtime +1해당 내용을 모두 무시하고 1일 0시간 0분 0초가 된 것으로 처리하시겠습니까? 이 경우 기술적으로는 1일보다 오래되지 않았으므로 무시됩니까?

안돼...안돼...계산.

답변1

의 매개변수는 -mtime다음과 같이 해석됩니다.하루 종일문서시대. -mtime +n방법엄밀히 말하면 다음보다 큼, -mtime -n방법엄격하게미만.

Bash를 사용하면 보다 직관적인 작업을 수행할 수 있습니다.

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

24시간보다 오래된 파일과 24시간보다 새로운 파일을 각각 찾습니다.

-mtime(시간 또는 분 단위로 구문 분석하려는 경우 소수 인수를 입력하는 것보다 쉽습니다.)

답변2

글쎄, 내 생각에 간단한 대답은 find 구현이 POSIX/SuS 표준을 따르기 때문에 이런 방식으로 동작해야 한다는 것입니다. 에서 인용SUSv4/IEEE Std 1003.1, 2013년판, "찾기":

-mtime n 파일 수정 시간을 86400으로 나눈 값(나머지 버림)
     이 초기화 시간에서
     n인 경우 마스터 용어는 true로 평가되어야 합니다 .

(문서의 다른 부분에서는 n실제로 무엇이 될 수 있는지 +n와 "보다 큼"이 무엇을 의미하는지 설명합니다).

표준에서 왜 이렇게 해야 하는지에 대해 말하자면, 오래 전에 프로그래머들은 게으르거나 이에 대해 생각하지 않고 그냥 C 코드를 작성했던 것 같습니다 (current_time - file_time) / 86400. C 정수 연산은 나머지를 버립니다. 스크립트는 이 동작에 의존하게 되었고 표준화되었습니다.

정식 동작은 시간이 아닌 수정 날짜만 저장하는 가상 시스템에도 이식 가능합니다. 그런 시스템이 있는지는 모르겠습니다.

답변3

24시간 소수점 이하 기간은 잘립니다! 이는 "find -mtime +1"이 이틀 이상 전에 수정된 파일과 일치한다는 의미입니다.

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

아마도 다음은 GNU에만 적용되는 것일까요?

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

답변4

따라서 파일이 1일 23시간 59분 59초가 지난 경우 find -mtime +1은 모든 것을 무시하고 1일 0시간 0분 0초가 된 것처럼 처리합니까?

예. 말했듯 man find이 "모든 소수 부분은 무시됩니다". "1일 23시간 59분 59초"를 "24시간"으로 나누면 1.9999가 나오는데 0.9999 부분이 삭제되고 갑자기 파일에 1일만 남게 됩니다.

관련 정보