특정 디렉터리에서 가장 오래된 파일의 나이를 찾고 싶거나 디렉터리에 파일이 없으면 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
그리고 :zsh
perl
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])
: 글로벌 한정자:N
nullglob
:이 구체에 대해 열려 있습니다. 따라서 디렉토리에 파일이 없으면 확장이 비어 있으므로 가 반환perl
됩니다 .-M
undef
-
: 다음 전역 한정자가 기호 링크의 대상에 적용됩니다.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}
초기화m
됨d
$0 < m {m = $0}
최소 트랙m
END {print d - m}
인쇄 차이.