행에서 가장 오래된 파일의 나이를 찾거나 0을 반환합니다.

행에서 가장 오래된 파일의 나이를 찾거나 0을 반환합니다.

특정 디렉터리에서 가장 오래된 파일의 나이를 찾고 싶거나 디렉터리에 파일이 없으면 0을 반환하고 싶습니다. 또한 이를 수행하려면 한 줄 명령이 필요합니다. 지금까지 다음은 디렉터리에서 가장 오래된 파일의 기간(초)을 찾는 데 사용하는 명령입니다.

expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))

문제는 파일이 없으면 다음 오류가 반환된다는 것입니다.

$ expr $(($(date +%s) - $(stat -c %Y $(ls -lt /path/to/dir/ | tail -1 | awk '{print $NF}'))))
stat: cannot stat ‘0’: No such file or directory
-bash: 1554373460 - : syntax error: operand expected (error token is "- ")

따라서 이 경우에는 명령이 0을 반환하고 오류 출력을 억제하기를 원합니다.

답변1

그리고 :zshperl

perl -le 'print 0+-M $ARGV[0]' /path/to/dir/*(N-Om[1])

D(숨겨진 파일도 고려하고 싶다면 (그러나 제외 .) ..glob 한정자를 추가하세요.)

기호 링크의 경우 해석되는 파일의 수정 시간이 고려됩니다. -심볼릭 링크의 수정 시간을 설명하려면 glob 한정자에서 in을 제거하세요 (그리고 심볼릭 링크의 수명을 얻으려면 (lstat$ARGV[0] && -M _)in을 사용하세요).perl

이것은 일 단위의 나이를 제공합니다. 초 수를 얻으려면 86400을 곱하십시오.

perl -le 'print 86400*-M $ARGV[0]' /path/to/dir/*(N-Om[1])
  • (N-Om[1]): 글로벌 한정자:
    • Nnullglob:이 구체에 대해 열려 있습니다. 따라서 디렉토리에 파일이 없으면 확장이 비어 있으므로 가 반환 perl됩니다 .-Mundef
    • -: 다음 전역 한정자가 기호 링크의 대상에 적용됩니다.
    • Om: 수정 시간에 따른 역방향(대문자) 순서(예: 가장 오래된 것부터 최신 것까지 ls -rt)
    • [1]: 일치하는 첫 번째 파일만 선택
  • -M file: 파일 내용의 나이를 가져옵니다.
  • 0+또는 86400*(이 undef경우) 숫자로 캐스트합니다.

답변2

한 줄이어야 하는 경우:

stat -c %Y ./* 2>/dev/null | awk -v d="$(date +%s)" 'BEGIN {m=d} $0 < m {m = $0} END {print d - m}'
  • stat -c %Y ./* 2>/dev/null오류를 무시하고 모든 파일의 타임스탬프를 인쇄합니다. 따라서 어떤 파일도 출력되지 않습니다.
  • awk를 사용하세요:

    • -v d="$(date +%s)"현재 타임스탬프를 변수에 저장d
    • BEGIN {m=d}초기화 md
    • $0 < m {m = $0}최소 트랙m
    • END {print d - m}인쇄 차이.

관련 정보