+mtime, +mmin 옵션을 사용할 때 이상한 동작 "find command"

+mtime, +mmin 옵션을 사용할 때 이상한 동작 "find command"

프로덕션 서버가 있습니다. 특정 개체에 대한 디렉터리가 1개 있는데 다른 네트워크 노드에서 파일을 수집한 후 계속 파일이 쌓입니다. 따라서 해당 하위 디렉터리에는 2021년 5월의 파일이 포함됩니다. 일반적으로 매 시간마다 하루 분량의 하위 디렉터리를 생성하고 해당 하위 디렉터리에 파일을 푸시합니다. 하위 디렉토리 구조 -

여기에 이미지 설명을 입력하세요.

다음 명령을 사용하여 find . -type f -mtime +2 | xargs ls -ltr 2일 전의 파일을 나열하여 삭제했습니다.

그런데 확인 명령어를 실행해보니 의외의 방식으로 정렬되어 있는 것을 발견했습니다.

여기에 이미지 설명을 입력하세요.

위에서 볼 수 있듯이 이상적으로는 10-03 파일을 먼저 단축한 다음 11-03 파일을 단축해야 하지만 정반대입니다. 또 다른 점은 해당 날짜(18-03)의 파일도 나열한다는 것입니다. 그럼 누군가가 그것에 대해 좀 밝힐 수 있습니까?

디렉토리 크기는 11G입니다. 그리고 파일은 일반적으로 1분마다 쌓이고 있는데 이것이 영향을 미치나요?

디스트로-Red Hat Enterprise Linux 서버 버전 7.6(Maipo)

답변1

find . -ctime +2파일 보고마지막으로 변경된 상태 시간3일 이상이 지났습니다( find시작 시간과 파일의 ctime 사이의 차이(정수 일수로 반올림)가 2보다 큼).

ctime인쇄할 수 있는 내용은 ls -lc파일에 대한 내용이 수정되면 업데이트됩니다(액세스 시간 제외). 디렉터리의 항목 이름이 변경될 때, 새 디렉터리에서 연결이 해제될 때, 해당 내용이 또는 권한이나 기타 메타데이터가 있을 때 변화...

ls -l기본적으로 표시되고 ls -t기본적으로 정렬되는 타임스탬프는 다음과 같습니다.마지막 수정. 이 값은 내용이 수정될 때만 업데이트됩니다(명령을 사용하여 임의로 설정할 수도 있음 touch). 이는 다음과 같이 볼 수 있습니다.파일 콘텐츠 생성 시간.

그 외에는마지막 액세스 시간, 일부 시스템에는출생 시간또한 ~으로 알려진생성 시간, 비록 일반적으로만큼 좋지는 않지만마지막 수정. 최신 버전의 GNU ls(RHEL7 시스템에는 없음) 의 경우 ls -l --time=birth또는 로 표시될 수 있습니다 ls -l --time=creation.

2일 이상 전에 마지막으로 수정된 일반 파일을 찾아 전달하여 ls가장 오래된 것부터 최신 순으로 나열하려면 다음을 수행할 수 있습니다.

find . -type f -mtime +1 -exec ls -lrtd {} +

which (with 제외)로 처리할 수 없는 출력을 사용하지 마세요 xargs.findfind -print0 | xargs -r0...

그러나 여러 인스턴스를 실행할 수 있으며 xargs, 이로 인해 독립적으로 정렬된 여러 파일 배치가 출력됩니다.find -exec cmd {} +cmd

이를 방지하려면 zsh다음을 사용하고 수행할 수 있습니다.

autoload zargs
zargs -- ./**/*(D.m+1Om) -- ls -Uld

또는 xargs분할에 GNU를 사용하십시오.

print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --

(정렬하지 않는 GNU 확장입니다 -U(이미 정렬되어 있으므로 필요하지 않음). 다른 구현으로 대체할 수 있습니다).lszsh-rtls

언제든지 전혀 분할하지 않으려고 시도할 수 있지만 명령에 전달하고 확인할 수 있는 길이 또는 인수 + 환경에 대한 제한이 발생할 수 있습니다.매개변수 목록이 너무 깁니다.실수:

ls -lrtd -- **/*(D.m+1oN)

findzsh , sortsed유틸리티 의 GNU 구현을 사용하여 zsh를 설치할 수 없는 경우 xargs( lsRHEL7에서 볼 수 있음) 다음을 수행할 수 있습니다.

find . -type f -mtime +1 -printf '%T@:%p\0' |
  LC_ALL=C sort -zn |
  LC_ALL=C sed -z 's/^[^:]*://' |
  xargs -r0 ls -Uld

find파일을 숫자로 인쇄하여 mtime 별로 수동으로 정렬하고 다음 을 사용하여 %T@정렬합니다 . 이 모든 작업은 NUL로 구분된 레코드를 사용하여 수행되므로 임의의 파일 경로를 사용할 수 있습니다.sort -nsedxargsls-U

어쨌든 GNU를 사용하여 이러한 파일을 삭제하려면 해당 조건 find자를 사용하면 됩니다 -delete.

find . -type f -mtime +1 -delete

관련 정보