여러 패턴이 있는 최신 날짜의 파일 찾기 [닫기]

여러 패턴이 있는 최신 날짜의 파일 찾기 [닫기]

아래 언급된 패턴의 최신 수정 날짜 파일을 찾아야 하는 아래와 같은 코드 조각이 있습니다.

array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))

날짜가 여러 개인 파일이 /path 디렉터리에 존재할 수 있습니다. find 명령이나 ls -ltr을 통해 동일한 결과를 얻으려면 어떻게 해야 합니까?

답변1

쉘을 사용하면 짧은 쉘 패턴을 구성하여 이름이 패턴과 일치하는 최근 수정된 일반 파일을 zsh찾을 수 있습니다 ./pathREF_DATA*

/path/**/REF_DATA*(.NDom[1])

이 쉘 글로빙 패턴에서는 **모든 수준의 하위 디렉터리가 일치합니다. 끝에 있는 괄호는 이전 와일드카드 패턴의 동작을 수정하는 와일드카드 한정자입니다. 이 경우 디렉터리나 다른 파일 형식이 아닌 일반 파일만 일치하도록 지정합니다. N쉘에서 및 쉘 옵션을 활성화하는 것과 동일한 효과 가 있습니다 D. 일치하는 항목이 없으면 패턴을 제거하고 패턴을 숨겨진 이름과 각각 일치시킵니다.nullglobdotglobbash

마지막 항목은 수정 타임스탬프를 om기준으로 [1]파일을 정렬 하고 가장 최근에 수정된 파일인 정렬된 집합의 첫 번째 항목을 반환합니다.

REF_DATA*가장 최근에 수정된 파일을 일치시키거나 REF_CUST*사용하기를 원합니다.

/path/**/REF_(DATA|CUST)*(.NDom[1])

예를 들어 다음과 같은 일부 유틸리티에서 이 모드를 사용할 수 있습니다.

printf '%s\n' /path/**/REF_(DATA|CUST)*(.NDom[1])

경로 이름의 파일 이름 부분만 얻으려면 :t와일드카드 끝에 추가하십시오.

쉘이 아닌 경우 zsh다음을 사용하여 호출할 수 있습니다.

zsh -c 'printf "%s\n" /path/**/REF_(DATA|CUST)*(.NDom[1]:t)'

또는 두 패턴 중 하나와 일치하는 두 파일을 별도의 배열에 넣으려면 bash(두 파일이 모두 존재하는 경우 그렇지 않으면 배열에 항목이 1개 또는 0개 표시됩니다)

array=(
    "$( zsh -c 'printf "%s\n" /path/**/REF_DATA*(.NDom[1]:t)' )"
    "$( zsh -c 'printf "%s\n" /path/**/REF_CUST*(.NDom[1]:t)' )"
)

파일 이름에 줄바꿈이 있는 경우 이를 제거할 수 있다는 점에 유의하세요(흔하지 않지만 기술적으로는 가능합니다).

애초에 편지를 쓰면 zsh당연히 전화는 안 하고 zsh -c그냥 전화만 할 텐데.

array=(
    /path/**/REF_DATA*(.NDom[1]:t)
    /path/**/REF_CUST*(.NDom[1]:t)
)

답변2

그리고통계자료Linux에서는 다음과 같이 할 수 있습니다.

find ... -exec stat -f "%Y %N" {} + |sort -rn|head -1|cut -f2

존재하다macOS 통계, 매개변수는 다르게 정의됩니다.

find ... -exec stat -f "%m%t%N" {} + |sort -rn|head -1|cut -f2

아이디어는 파일 이름 목록과 마지막 수정 시간(epoch 초)을 반환하고 시간의 내림차순으로 목록을 정렬하고 목록에서 가장 최근에 수정된 개체의 이름을 가로채는 것입니다.

두 경우 모두 공백이 포함된 파일 이름은 에포크 초와 파일 이름 사이에 탭 구분 기호를 사용하여 처리됩니다.

관련 정보