최근에 수정된 파일을 찾는 방법은 무엇입니까?

최근에 수정된 파일을 찾는 방법은 무엇입니까?

디렉토리에 많은 파일이 있고 접미사가 붙은 가장 최근에 수정된 파일에 대해 일부 작업을 수행해야 합니다 .txt.

이상적으로는 하고 싶습니다.

myutility "$newest"

마지막으로 $newest가장 최근에 수정된 파일의 경로 이름은 어디에 있습니까?

.txt디렉터리 계층 구조에서 가장 최근에 수정된 파일을 접미사로 가져올 수 있도록 추가로 일반화할 수 있다면 좋을 것입니다. 예를 들어 가장 최근에 수정된 5개의 파일을 가져와 더 잘 사용할 수 있다면 좋을 것입니다.

myutility "${newest[@]}"

.txt전체 디렉터리 계층에서 가장 최근에 수정된 5개의 파일에 대해 내 유틸리티를 실행합니다.

bashor 을 사용하는 솔루션이 ksh93가장 좋습니다.

답변1

질문에 glob 한정자 bash및 를 사용하여 태그를 지정했지만:kshzsh

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

보기 흉해 보일 수도 있지만 findgetfile을 사용하는 것이 이름의 공백 및 기타 특수 문자 문제를 방지하는 가장 안정적인 방법입니다. 수정 시간 + 파일 목록이 최신순으로 정렬되어 맨 위로 이동합니다.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

관련 정보