[bash] 디렉토리에서 최신 수정 파일을 재귀 적으로 찾는 방법은 무엇입니까?

ls재귀 호출을 수행 할 때 파일을 올바르게 정렬하지 않는 것 같습니다 .

ls -altR . | head -n 3

디렉토리 (하위 디렉토리 포함)에서 가장 최근에 수정 된 파일을 어떻게 찾을 수 있습니까?



답변

find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "

거대한 나무의 경우 sort모든 것을 메모리에 보관하기 가 어려울 수 있습니다 .

%T@유닉스 타임 스탬프와 같은 수정 시간을 제공하고, sort -n숫자로 정렬 tail -1하고, 마지막 라인 (가장 높은 타임 스탬프)을 취하고 cut -f2 -d" ", 출력에서 ​​첫 번째 필드 ( 타임 스탬프)를 잘라냅니다.

편집 : 것처럼 -printf아마의 GNU 전용 ajreals 사용하다 stat -c너무. BSD에서도 같은 작업을 수행 할 수 있지만 포맷팅 옵션이 다릅니다 ( -f "%m %N"보여 질 것입니다)

그리고 나는 복수의 일부를 놓쳤다. 당신이 더 많은 그런 다음 원하는 경우 최신 파일을 바로 꼬리 인수를 범프.


답변

@ plundra ‘s answer 다음에 BSD 및 OS X 버전이 있습니다.

find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "


답변

결과를 정렬하고 마지막으로 수정 된 결과 만 유지하는 대신 awk를 사용하여 수정 시간이 가장 큰 결과 만 인쇄 할 수 있습니다 (유닉스 시간).

find . -type f -printf "%T@\0%p\0" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\0'

파일 수가 충분하면 문제를 해결하는 가장 빠른 방법입니다.

이론적으로 파일 이름에는 공백과 줄 바꿈을 포함한 모든 문자가 포함될 수 있지만 NUL 문자 (예 : ‘\ 0’)를 사용했습니다.

시스템에 병리학 적 파일 이름이 없으면 줄 바꿈 문자도 사용할 수 있습니다.

find . -type f -printf "%T@\n%p\n" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\n'

또한 이것은 멍청이에서도 작동합니다.


답변

나는이 솔라리스 10에서 마지막으로 수정 된 파일을 찾을 수있는 문제가 있었다 find이없는 printf옵션 및 stat사용할 수 없습니다입니다. 나는 나에게 잘 맞는 다음 해결책을 발견했다.

find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1

파일 이름을 표시하려면

find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1

설명

  • find . -type f 모든 파일을 찾아서 나열합니다
  • sed 's/.*/"&"/' 공백을 처리하기 위해 경로 이름을 따옴표로 묶습니다.
  • xargs ls -E에 인용 된 경로를 전송 ls, -E옵션은 풀 타임 스탬프 (형식 있는지 확인합니다 년 – 월 – 일시 – 분 – 초 – 나노초가 ) 반환
  • awk '{ print $6," ",$7 }' 날짜와 시간 만 추출
  • awk '{ print $6," ",$7," ",$9 }' 날짜, 시간 및 파일 이름 추출
  • sort 날짜별로 정렬 된 파일을 반환합니다
  • tail -1 마지막으로 수정 된 파일 만 반환

답변

하위 디렉토리에서도 잘 작동하는 것 같습니다.

find . -type f | xargs ls -ltr | tail -n 1

파일이 너무 많으면 찾기를 세분화하십시오.


답변

사람이 읽을 수있는 타임 스탬프가있는 최신 파일을 표시합니다.

find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1

결과는 다음과 같습니다.

2015-10-06 11:30: +0200 ./foo/bar.txt

더 많은 파일을 표시하려면 더 -n1높은 숫자로 바꾸십시오


답변

나는 가장 최근에 수정 된 파일의 최상위 k 목록뿐만 아니라 항상 비슷한 것을 사용합니다. 큰 디렉토리 트리의 경우 정렬을 피하는 것이 훨씬 빠릅니다 . 가장 최근에 수정 된 파일이 최상위 1 개인 경우 :

find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'

170 만 개의 파일이 포함 된 디렉토리에서 정렬을 사용하여 25.5s 솔루션에 비해 7.5 배 빠른 3.4s의 최신 파일을 얻습니다.