디렉토리에 많은 파일이 있고 접미사가 붙은 가장 최근에 수정된 파일에 대해 일부 작업을 수행해야 합니다 .txt
.
이상적으로는 하고 싶습니다.
myutility "$newest"
마지막으로 $newest
가장 최근에 수정된 파일의 경로 이름은 어디에 있습니까?
.txt
디렉터리 계층 구조에서 가장 최근에 수정된 파일을 접미사로 가져올 수 있도록 추가로 일반화할 수 있다면 좋을 것입니다. 예를 들어 가장 최근에 수정된 5개의 파일을 가져와 더 잘 사용할 수 있다면 좋을 것입니다.
myutility "${newest[@]}"
.txt
전체 디렉터리 계층에서 가장 최근에 수정된 5개의 파일에 대해 내 유틸리티를 실행합니다.
bash
or 을 사용하는 솔루션이 ksh93
가장 좋습니다.
답변1
질문에 glob 한정자 bash
및 를 사용하여 태그를 지정했지만:ksh
zsh
print **/*.txt(.om[1,5])
.
확장자( ) 가 있는 처음 5개의 일반 파일을 .txt
수정 시간별로 오름차순( om
) 으로 정렬하여 인쇄합니다.
전임자.
print **/*.txt(.om[1,5])
dir/file1.txt file2.txt dir/file.txt File1.txt File2.txt
답변2
ls를 사용하여 수정 시간(또는 생성 또는 액세스)별로 파일을 나열할 수 있습니다.
일반적인 말하기
ls -t *.txt | head -n5
마지막 5개의 .txt 파일 가져오기
$() 또는 xargs를 사용하여 myutility에 공급할 수 있습니다.
ls -t *.txt | head -n5 | xargs myutility
재귀가 필요한 경우 find를 사용할 수 있습니다.
find -type f -iname "*.txt" | xargs ls -t | head -n5 | xargs myutility
(가능한 문제: 이 작업을 수행하려면 최소한 하나의 .txt 파일이 있어야 합니다. 수정할 수 있지만 이것이 가장 깔끔한 솔루션입니다.)
편집: OP는 공백이 있는 파일 이름을 처리하는 방법을 궁금해했습니다. 해결책은 다음과 같습니다.
find -type f -iname "*.txt" | xargs ls -t | head -n5 | tr '\n' '\0' | xargs -0 myutility
위에서 언급한 가능한 문제를 해결하려면 헤더 앞의 파일을 확인하거나 find ..... | egrep '.*' || exit
단순히 ls에 의미 없는 파일 이름을 포함하고 유사한 경고를 무시하면 됩니다 xargs ls -t ''
.
답변3
보기 흉해 보일 수도 있지만 find
getfile을 사용하는 것이 이름의 공백 및 기타 특수 문자 문제를 방지하는 가장 안정적인 방법입니다. 수정 시간 + 파일 목록이 최신순으로 정렬되어 맨 위로 이동합니다.N(여기 5
) 시간을 제거하고 파일 이름만 남겨두고 이를 스크립트에 전달합니다.
find dir -iname '*.txt' -printf '%T@\t%p\0' | sort -znr | head -z -n 5 | grep -zPo '^\S+\s+\K[\S\s]*' | xargs -0r myutility
이전 버전 coreutils
(< v8.25 head
는 지원되지 않음 -z
) 또는 grep
(< v2.25는 지원되지 않음)을 사용하는 경우실수), 다음 스크립트를 사용할 수 있습니다.
#!/bin/bash
flimit=5
filenames=()
while (( flimit-- )) && IFS=$'\t' read -r -d $'\0' mtime filename; do
filenames=("${filenames[@]}" "$filename")
done < <(find -name '*.txt' -printf '%T@\t%p\0' | sort -znr)
if [[ ${#filenames[@]} -gt 0 ]]; then
myutility "${filenames[@]}"
else
>&2 echo no files found
fi