find -mtime +1이 2 일보다 오래된 파일 만 반환하는 이유는 무엇입니까? for

나는 주위에 내 마음을 포장하기 위해 사투를 벌인거야 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

그런 다음 -mtime +1스위치로 find를 실행 하고 다음 출력을 얻었습니다.

[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 초와 같이 처리합니까? 어떤 경우에는 기술적으로 하루가 지나서 무시되지 않습니까?

… 계산하지 않습니다.



답변

간단한 대답은 찾기 구현이 POSIX / SuS 표준을 준수한다는 것입니다. SUSv4 / IEEE Std 1003.1, 2013 Edition, “find” 에서 인용 :

-mtime n
     초기화 시간에서
     뺀 파일 수정 시간
을 86400으로 나눈 값 (나머지는 버림)이 n 인 경우 기본은 true로 평가됩니다 .

(이 문서의 다른 곳에 n는 실제로있을 수 +n있으며 그 의미가 “보다 큼” 이라고 설명되어 있습니다 .

표준이 왜 그렇게 행동해야하는지에 관해서는, 과거에는 프로그래머가 오랫동안 게 으르거나 생각하지 않았고 C 코드를 작성했다고 생각합니다 (current_time - file_time) / 86400. C 정수 산술은 나머지를 버립니다. 해당 동작에 따라 스크립트가 시작되어 표준화되었습니다.

지정된 동작은 수정 날짜 만 저장 한 가상 시스템에 이식 가능합니다 (시간이 아님). 그런 시스템이 존재하는지 모르겠습니다.


답변

에 대한 인수 는 파일 연령의 전체 날짜-mtime 수로 해석됩니다 . 수단 보다 더 엄격 , 수단 엄격 미만.-mtime +n-mtime -n

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

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

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

( -mtime시간 또는 분 단위로 해상도를 원할 때 분수 인수를 입력하는 것보다 쉽습니다 .)


답변

소수의 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


답변

따라서 파일이 1 일, 23 시간, 59 분 및 59 초 오래된 경우 find -mtime +1은 모든 것을 무시하고 1 일, 0 시간, 0 분 및 0 초와 같이 취급합니까?

예. 등 man find“어떤 소수 부분은 무시됩니다”라고 말한다. “1 일, 23 시간, 59 분 및 59 초”를 “24 시간”으로 나누면 1.9999가 표시 될 수 있지만 .9999 부분이 제거되고 갑자기 파일의 길이가 1 일밖에되지 않습니다.


답변

-mtime NA 일 (일)이 NA < N +1을 만족 하는 파일을 의미합니다 . 즉, NN +1 일 전에 마지막으로 수정 된 파일을 선택합니다 .-mtime N

-mtime -N는 연령 AA < N을 충족 하는 파일, 즉 N 일 전에 수정 된 파일을 의미합니다 . 덜 직관적으로, 연령 AN +1 ≤ A를 충족 하는 파일 , 즉 적어도 N +1 일 전에 수정 된 파일을 의미합니다 .-mtime +N

예를 들어 -mtime 11 일에서 2 일 전에 수정 된 파일을 선택합니다. -mtime +1최소 2 일 전에 수정 된 파일을 선택합니다. 적어도 하루 전에 파일을 수정하려면을 사용하십시오 -mtime +0.

“n * 24 시간 전에 마지막으로 수정되었습니다”라는 설명은 근사치 일 뿐이며 명확한 것은 아닙니다.

이러한 규칙을 기억하기 어려운 경우 참조 파일을 대신 사용하십시오.

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

(“1 일 전”구문에는 GNU가 필요합니다 touch.)


답변

정확한 결과를 얻으려면 -mmin, -amin 등을 사용하십시오.


답변

정확히 48 시간짜리 파일이 아닌 이일을 원하는 경우에, 당신은 추가해야합니다 --daystart당신의 find명령을 실행합니다. 도움이 될 것입니다.

find . type -f -daystart -mtime +1