스크립트 - 디렉터리의 최신 파일이 "X"시간보다 오래되었는지 확인

스크립트 - 디렉터리의 최신 파일이 "X"시간보다 오래되었는지 확인

디렉토리에서 최신 파일을 찾고 파일이 "X"시간보다 오래된 경우에만 해당 경로를 인쇄하는 명령이나 스크립트를 생각하려고 합니다.

이에 대한 아이디어는 스크립트가 "X"시간보다 오래된 경우에만 값(최신 파일의 경로)을 반환한다는 것입니다. 아무것도 반환하지 않으면 최신 파일이 지정된 시간보다 젊다는 의미입니다.

답변1

zsh셸 에서 다음 파일 이름 와일드카드 패턴은 숨겨지지 않은 이름과 일치합니다.

*

다음은 숨겨지지 않은 이름을 가진 일반 파일과 일치합니다.

*(.)

nullglob에서처럼 작동 하게 하려면 bash한정자를 추가하세요 N. D숨겨진 이름을 일치시키려면 다음을 추가할 수도 있습니다("점 파일"에 표시됨).

*(.ND)

mh+34시간 이상 전에 수정된 일반 파일의 이름만 일치시키려면 추가하세요 .

*(.NDmh+3)

mtime 타임스탬프를 기준으로 일치하는 이름을 정렬합니다.

*(.NDmh+3om)

이름 선택(가장 최근에 수정됨):

*(.NDmh+3om[1])

에서 bash:

zsh -c 'print -rC1 some/dir/path/*(.NDmh+3om[1])'

답변2

이는 statGNU coreutils를 사용합니다.

# use stat to find the mtime of the newest file
read -r age name < <(stat -c $'%Y\t%n' * | sort -nr | head -1)

# number of hours, get the limit epoch time
hrs=4
limit=$((EPOCHSECONDS - hrs * 3600))

# print the filename if it's older
((age < limit)) && echo "$name"

가설

  • 귀하의 $PWD는 문제의 디렉토리입니다
  • 파일 이름에 개행 문자가 포함되어 있지 않습니다.
  • 귀하의 bash 버전은 ... 최신입니다 (EPOCHSECONDS 변수가 언제 도입되었는지 확실하지 않음)

답변3

stat를 사용하는 또 다른 솔루션이 더 깔끔하지만 흥미롭고 효과가 있다고 생각하여 짧은 솔루션을 게시하기로 결정했습니다.

find -maxdepth 1  -mmin -60  -type f  | grep -q . || ls -tr | tail -1

이것이 어떻게 작동하는지 설명하기 위해 먼저 "최신 파일" 범위에 있는 모든 파일을 나열합니다. 아무것도 발견되지 않으면 grep -q .아무것도 출력되지 않고 실행이 종료됩니다. 그러나 아무것도 출력하지 않으면 grep은 오류 코드를 반환하므로 or ("||")는 실행을 발생시켜 ls -tr | tail -1디렉터리에서 가장 오래된 항목을 표시합니다.

관련 정보