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


116

나는 주위에 내 마음을 포장하기 위해 사투를 벌인거야 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 초와 같이 처리합니까? 어떤 경우에는 기술적으로 하루가 지나서 무시되지 않습니까?

... 계산하지 않습니다.


7
처음에는 나에게도 재미있어 보였지만 정수 일 단위의 파일 나이를 측정한다고 생각하면 정확히 예상대로 수행됩니다. 1 일 된 파일은 제공하지 않습니다. int (1.99) 일의 파일이 1보다 크지 않습니다.
Octopus

답변:


86

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

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

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

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

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


2
find는 정리 작업 만 수행하도록 명확하게 설계되었습니다.
Kjeld Flarup 2012 년

83

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

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

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

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

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


2
사람이 읽을 수있는 크기와 시간 순서대로 해당 파일 (일반 파일 만)을 나열하려면 다음을 수행하십시오.$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev

1
이것은 두 명령이 함께 24 시간 전에 그 1 분 동안의 파일을 여전히 그리워한다는 점에서도 동일한 효과를 갖습니다.
Octopus

1
$(())일반 쉘 산술 구문이며 Bash에만 국한되지 않습니다. pubs.opengroup.org/onlinepubs/009695399/utilities/…
Josip Rodin

@JosipRodin 아니오, 반드시 그런 것은 아닙니다! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Bash는 "확장 된"SH이므로이 구문을 지원하지만 csh / tcsh와 같은 일부 다른 쉘은 지원하지 않습니다.
t0r0X

@ t0r0X 내 요점은 그것이 bashism이 아니라 대시와 zsh에서 작동하고 다른 어떤 것이 든 기존의 역할을한다는 것 /bin/sh입니다.
Josip Rodin이

44

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

고마워, 나는 왜 -mtime X가 -mtime + X와 다른지 알아 내려고 노력했다.
Vnge

+ X는 (X + 1, X + 2, X + 3, ...)의 단락을 의미한다고 생각합니다. :)
Eric Zheng

18

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

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


18

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


3
좋은 설명, 첫 3 단락은 문서에 추가해야합니다 find!
Melebius

4

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


6
-?min인수 정확히 같은 일 -?time이 아닌 몇 분의 일 제외하고 인수. 그들은 "정확한"것도 아닙니다.
Gilles

-2

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

find . type -f -daystart -mtime +1

5
아니요, 먼저 -daystart(GNU 확장) 아닙니다 --daystart. 그런 다음 -daystart현재 시간 대신 오늘의 시작 시간과 시간을 비교하는 것을 의미하므로 오늘 시작 --daystart -mtime +148 시간 / 2 시간 전에 수정 된 파일, 즉 일반적으로 어제 전날에 수정 된 파일을보고합니다. .
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.