아래 언급된 패턴의 최신 수정 날짜 파일을 찾아야 하는 아래와 같은 코드 조각이 있습니다.
array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))
날짜가 여러 개인 파일이 /path 디렉터리에 존재할 수 있습니다. find 명령이나 ls -ltr을 통해 동일한 결과를 얻으려면 어떻게 해야 합니까?
답변1
쉘을 사용하면 짧은 쉘 패턴을 구성하여 이름이 패턴과 일치하는 최근 수정된 일반 파일을 zsh
찾을 수 있습니다 ./path
REF_DATA*
/path/**/REF_DATA*(.NDom[1])
이 쉘 글로빙 패턴에서는 **
모든 수준의 하위 디렉터리가 일치합니다. 끝에 있는 괄호는 이전 와일드카드 패턴의 동작을 수정하는 와일드카드 한정자입니다. 이 경우 디렉터리나 다른 파일 형식이 아닌 일반 파일만 일치하도록 지정합니다. N
쉘에서 및 쉘 옵션을 활성화하는 것과 동일한 효과 가 있습니다 D
. 일치하는 항목이 없으면 패턴을 제거하고 패턴을 숨겨진 이름과 각각 일치시킵니다.nullglob
dotglob
bash
마지막 항목은 수정 타임스탬프를 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 초)을 반환하고 시간의 내림차순으로 목록을 정렬하고 목록에서 가장 최근에 수정된 개체의 이름을 가로채는 것입니다.
두 경우 모두 공백이 포함된 파일 이름은 에포크 초와 파일 이름 사이에 탭 구분 기호를 사용하여 처리됩니다.