디렉토리 목록을 찾은 다음 해당 디렉토리에서 특정 파일을 검색하고 최신 파일을 선택하고 싶습니다.
이것이 내가 시도한 것입니다:
find /Temp -type d -name Ast 2>/dev/null | while read Dir; do find $Dir -type f -name Pagination.json 2>/dev/null -exec ls -lt {} +; done
이렇게 하면 예상되는 파일이 표시되지만 오름차순으로 정렬됩니다.
이 명령의 결과는 다음과 같습니다.
-rw-r--r-- 1 root root 46667 Sep 12 18:10 /Temp/ProjectOne/Site/Ast/BaseComponents/Pagination.json
-rw-r--r-- 1 root root 46667 Sep 13 09:31 /Temp/ProjectTwo/Site/Ast/BaseComponents/Pagination.json
이 경우 두 번째 항목이 필요합니다. 어떻게 해야 합니까?
답변1
내가 이 문제를 해결한 방법은 쉘 자체의 파일 조회 기능을 사용하여 모든 후보를 찾은 다음 최신 항목을 유지하는 것이었습니다.
#!/bin/bash
# enable ** as recursive glob, don't fail when null matches are found, and
# also look into things starting with .
shopt -s globstar nullglob dotglob
newestmod=0
for candidate in **/Ast/**/Pagination.json ; do
# check file type:
[[ -f ${candidate} ]] || continue
[[ -L ${candidate} ]] && continue
# Get modification time in seconds since epoch without fractional
# part. Assumes GNU stat or compatible.
thisdate=$(stat -c '%Y' -- "${candidate}")
# if older than the newest found, skip
[[ ${thisdate} -lt ${newestmod} ]] && continue
newestmod=${thisdate}
newestfile="${candidate}"
done
if (( newestmod )); then
printf 'Newest file: "%s"\n' "${newestfile}"
fi
아니면 그런 것.
에서는 zsh
모든 것이 덜 복잡해지고 타임스탬프에 대한 1초 미만의 정밀도가 지원됩니다.
#!/usr/bin/zsh
#get the list of regular (`.`) files, `o`rdered by `m`odification date
allcandidates=(**/Ast/**/Pagination.json(ND.om))
if (( $#allcondidates )) print -r Newest file: $allcandidates[1]
그렇지 않으면:
print -r Newest file: **/Ast/**/Pagination.json(D.om[1])
**/
zsh 및 bash5.0+에서는 디렉토리 트리를 재귀적으로 순회할 때 심볼릭 링크를 따르지 않지만 이 섹션 Ast/
에서는 심볼릭 링크를 순회합니다. 이것이 문제인 경우 다음 zsh
방법으로 해결할 수 있습니다.
set -o extendedglob
print -r Newest file: ./**/Pagination.json~^*/Ast/*(D.om[1])
where는 ./**/Pagination.json
심볼릭 링크를 거치지 않고 모든 파일을 찾지만 여기에 포함 ~pattern
되지 않은 패턴과 일치하는 경로를 제거합니다 .^
/Ast/
답변2
"최신"이 정확히 무엇을 의미하는지에 따라 조금씩 달라지지만, GNU 구현이 find
가능하고 개행 문자가 포함된 파일 경로가 없다는 것을 알고 있다면 다음과 같은 것을 사용합니다.
find /tmp -type f -printf "%T@ %p\n" | sort -rn
( /tmp -type f
정말로 관심 있는 파일을 찾으려면 다음과 같이 보일 것입니다 find /Temp -path '*/Ast/*' -type f -name 'Pagination.json'
.) 흥미로운 부분은 %T@
에포크 이후 파일의 마지막 수정 시간을 초 단위로 인쇄하는 것인데, 이는 정렬하기 쉽습니다.