나는 주위에 내 마음을 포장하기 위해 사투를 벌인거야 왜find
해석이가하는 방식으로 수정 시간 파일. 특히 -mtime +1
48 시간 미만의 파일을 표시하지 않는 이유를 이해 하지 못합니다.
예제 테스트로 수정 날짜가 다른 세 개의 테스트 파일을 만들었습니다.
[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 N
A 일 (일)이 N ≤ A < N +1을 만족 하는 파일을 의미합니다 . 즉, N 과 N +1 일 전에 마지막으로 수정 된 파일을 선택합니다 .-mtime N
-mtime -N
는 연령 A 가 A < N을 충족 하는 파일, 즉 N 일 전에 수정 된 파일을 의미합니다 . 덜 직관적으로, 연령 A 가 N +1 ≤ A를 충족 하는 파일 , 즉 적어도 N +1 일 전에 수정 된 파일을 의미합니다 .-mtime +N
예를 들어 -mtime 1
1 일에서 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