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
그런 다음 -mmin +1440
를 사용하여 find를 실행하고 다음 출력을 얻었습니다.
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
찾기 매뉴얼 페이지에 따르면 이것이 예상되는 동작임을 이해합니다.
-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 일 된 파일을 제공하지 않았습니다. int (1.99) 일 된 파일은 > 1이 아닙니다.
- 사람이 나이를 구어체로 어떻게 취급하는지 생각해보세요. 누군가 79.9 세라면 79 세라고합니다. 따라서 79 세 이상의 사람을 찾고 있다면 > 79.99999 세인 사람, 즉 >를 찾고 있습니다. = 80 세. 사람들은 연령을 정수로보고 반올림하고 각 연령을 범위로 간주합니다.
답변
음 , 간단한 대답은 찾기 구현이 POSIX / SuS 표준을 따르고 있다는 것입니다. SUSv4 / IEEE Std 1003.1, 2013 Edition, “find”에서 인용 :
-mtime n
초기화 시간에서 파일 수정 시간을 뺀
86400 (나머지 버림)으로 나눈 1 차는 참으로 평가됩니다.
(그 문서의 다른 곳에서는 n
가 실제로 +n
일 수 있으며 그 의미는 다음과 같습니다. “보다 큼”).
표준이 그런 방식으로 작동한다고 말하는 이유에 관해서는 오래 전에 프로그래머가 게 으르거나 그것에 대해 생각하지 않고 C를 작성했습니다. 코드 (current_time - file_time) / 86400
. C 정수 산술은 나머지를 버립니다. 스크립트는 해당 동작에 따라 시작되어 표준화되었습니다.
사양 된 동작도 이식 가능합니다. 수정 날짜 (시간 아님) 만 저장 한 가상 시스템에. 그런 시스템이 존재했는지 모르겠습니다.
댓글
- find는 정리 작업 만 수행하도록 설계되었습니다.
Answer
-mtime
에 대한 인수는
종일 파일 생성 기간입니다. -mtime +n
는 엄격히 큼 , -mtime -n
는 엄격하게
보다 작습니다.
Bash를 사용하면보다 직관적 인 작업을 수행 할 수 있습니다.
$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24))
각각 24 시간보다 오래된 파일과 최신 파일을 찾습니다.
(해결하려는 경우 -mtime
에 분수 인수를 입력하는 것보다 쉽습니다. 시간 또는 분)
댓글
- 사람이 읽을 수있는 크기와 chr로 해당 파일을 나열하려면 (일반 전용) 종양 적 순서는 다음과 같습니다.
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- 이 두 명령을 함께 사용하면 24 시간 전 1 분 창 안에있는 파일이 여전히 누락된다는 점에서 동일한 효과가 있습니다. .
-
$(())
는 일반 쉘 산술 구문이며, ' Bash에만 국한되지 않습니다. pubs.opengroup.org/onlinepubs/009695399/utilities/ … - @JosipRodin 아니요 , 반드시 사실은 아닙니다!
This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Bash는 " 확장 된 " SH이므로이 구문을 지원하지만 일부 다른 셸에서는 지원하지 않습니다. ' t, 예 : csh / tcsh. - @ t0r0X 내 요점은 '이 bashism이 아니라 dash 및 zsh에서 작동하며 다른 모든 것이 관습적인 역할을한다는 것입니다.
/bin/sh
.
답변
실수적인 24 시간 기간이 잘립니다. 즉, “find -mtime +1″은 2 일 이상 전에 수정 된 파일과 일치한다고 말합니다.
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에서만 작동 할 수 있나요?
p>
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
- + X는 (X + 1, X + 2, X + 3, …)의 단락을 의미한다고 생각합니다. 🙂
- 모든 소스 문서에 대한 링크는 간단한 대답을 혼란스럽게합니다. 예가 중요합니다. 좋은 문서. 그들 중 더 많은 것을 할 수 있습니다! 이 답변이 마음에 듭니다
답변
-mtime N
는 연령 A 는 N ≤ A < N 이상을 충족합니다. 1. 즉, -mtime N
는 N 에서 N +1 일 전에 마지막으로 수정 된 파일을 선택합니다.
-mtime -N
는 연령 A 가 A 를 충족하는 파일을 의미합니다. < N , 즉 N 일 이내에 수정 된 파일. 덜 직관적으로 -mtime +N
는 연령 A 가 N +1 ≤ A 를 충족하는 파일, 즉 파일을 의미합니다. 최소 N +1 일 전에 수정되었습니다.
예를 들어 -mtime 1
는 1 일에서 2 일 전에 수정 된 파일을 선택합니다. -mtime +1
는 최소 2 일 전에 수정 된 파일을 선택합니다. 최소 1 일 전에 수정 된 파일을 가져 오려면 -mtime +0
를 사용하세요.
“was last modified n * 24 hours ago”설명은 근사치 일 뿐이며 매우 명확한 규칙입니다.
이 규칙을 기억하기 어렵다면 참조 파일을 대신 사용하십시오.
touch -d "1 day ago" cutoff find . -newer cutoff
(구문“ 1 일 전”에는 GNU touch
가 필요합니다.)
댓글
- 좋은 설명, 처음 3 개 단락
find
!
Answer
따라서 파일이 1 일, 23 시간, 59 분, 59 초가 지난 경우 find -mtime +1은 모든 것을 무시하고 1 일처럼 처리합니다. , 0 시간 0 분 0 초?
예. man find
처럼 소수 부분은 무시됩니다. “”1 일 23 시간 59 분 59 초 “를”24 시간 “으로 나누면 1.9999가 표시되지만 t 그런 다음 .9999 부분이 제거되고 갑자기 파일이 1 일만 남았습니다.
Answer
-mmin, -amin 사용 등 정확한 결과를 얻으려면
댓글
-
-?min
인수는인수 (일 대신 분 포함). '도 “정확”하지 않습니다.
답변
2 일이 아니라 정확히 48 시간이 지난 파일을 원하면 find
명령에 --daystart
를 추가해야합니다. 도움이 될 것입니다.
find . type -f -daystart -mtime +1
댓글
- 아니요, 먼저 '의
-daystart
(GNU 확장),--daystart
가 아닙니다. 그런 다음-daystart
는 현재 시간이 아닌 오늘의 시작과 시간을 비교하는 것을 의미하므로--daystart -mtime +1
는 더 많이 수정 된 파일을보고합니다. 오늘 시작하기 48 시간 / 2 시간 전이므로 일반적으로 어제 전날 전에 교묘하게 수정 된 파일입니다.