디렉토리 목록에서 최신 파일을 찾도록 강요

디렉토리 목록에서 최신 파일을 찾도록 강요

디렉토리 목록을 찾은 다음 해당 디렉토리에서 특정 파일을 검색하고 최신 파일을 선택하고 싶습니다.

이것이 내가 시도한 것입니다:

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@에포크 이후 파일의 마지막 수정 시간을 초 단위로 인쇄하는 것인데, 이는 정렬하기 쉽습니다.

관련 정보