수정 된 날짜별로 최신 파일 찾기


38

하위 디렉토리가 포함 된 (큰) 디렉토리에서 최신 파일 (mtime)을 찾으려면 어떻게해야합니까?

내가 찾은 많은 게시물 은 하위 디렉토리가없는 한 괜찮은 몇 가지 변형을 ls -lt | head제안 ls -ltr | tail합니다.

그런 다음 다시

find . -type f -exec ls -lt \{\} \+ | head

하나의 명령으로 지정할 수있는만큼 많은 파일에 대한 트릭을 수행합니다. 즉, 디렉토리 가있는 경우 -exec...\+별도의 명령을 실행합니다. 그러므로 각 그룹은 ls그 자체 내에서 정렬 되지만 전체 세트가 아닌 정렬됩니다 . 따라서 헤드는 첫 번째 배치의 마지막 항목을 선택합니다.

답이 있습니까?


btw, 모든 백 슬래시가 필요하지 않습니다.
enzotib

@enzotib : 당신은 ( \ + ) 그렇지 않으면 얻는다find: missing argument to '-exec'
정렬

@arrange :에 +대한 의미가 없으므로이 오류 가 없으므로 bash이스케이프 할 필요가 없습니다.
enzotib

@enzotib : 당신이 바로, 내 실수는, 죄송합니다
준비

답변:


46

작업을 통해 필요한 모든 작업을 수행 할 수 있으므로 외부 명령 ( ls) 을 반복 할 필요가 없습니다 .find-printf

find /path -printf '%T+ %p\n' | sort -r | head

1
네, 생각해 find . -type f -exec stat --format=%y \{\} \+ | sort -r | head -n1냈지만 솔루션이 훨씬 깨끗합니다!
Rich

3
| cut -d ' ' -f2파일 이름 만 받기 위해 추가
qwr

head특정 줄 수를 포함 하도록 출력을 컬링 할 수도 있습니다 . 첫 번째 줄만 필요했기 때문에head -n 1
Timmah

8

오늘도 비슷한 문제가 있었지만없이 공격했습니다 find. ssh홈 디렉토리에서 가장 최근에 편집 한 파일을 반환하기 위해 실행할 수있는 짧은 것이 필요 했습니다. 이것은 대략 내가 생각해 낸 것입니다.

ls -tp | grep -v /$ | head -1

-p에 대한 옵션은 ls디렉토리에 후행 슬래시를 추가의 grep -v슬래시 (일명, 모든 디렉토리)로 끝나는 제거합니다 라인과 head -1한계를 하나의 파일로 출력.

find반환하고자하는 모든 파일 이름이면 사용 하는 것보다 훨씬 덜 장황 합니다.


하위 디렉토리는 처리하지 않습니다.
Clément

4

printf이유는 이해할 수 없지만 이것은 내 시스템에서보다 빠릅니다.

find /path -type f -exec stat -c "%y %n" {} + | sort -r | head

나는 더 빠르다.
enzotib

... | sort -r | head -n1 | cut -d " " -f 4-파일 이름 만 가져 오려면 한 가지 더 설명 하십시오.
林果 皞

sort -r여러 줄에 걸쳐 파일 이름이 존재하면 방금 잘못 발견했습니다 .
林果 皞

2

편집 : 나는이 게시물이 생각했던 것처럼 '특히 유용하지는 않다'고 생각합니다. 이것은 전체 파일 목록을 정렬하는 대신 가장 최근에 수정 된 파일을 추적하는 정말 빠른 솔루션입니다.

find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '

명확성을 위해 여러 줄에 걸쳐서 다음과 같이 보입니다.

find . -type f -printf '%T@ %p\n' | awk '
    BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
    {
        if ($1 > mostrecenttime)
            { mostrecenttime = $1; mostrecentline = $0; }
    }
    END { print mostrecentline; }' | cut -f2- -d ' '

편집 종료


특히 유용한 게시물은 아니지만 '배열'이 속도를 논의하고 있었기 때문에 이것을 공유한다고 생각했습니다.

정렬 및 enzotib의 솔루션은 디렉토리 내의 모든 파일을 mtimes로 나열한 다음 정렬하는 것입니다. 아시다시피 최대 값을 찾기 위해 정렬이 필요하지 않습니다. 최대를 찾는 것은 선형 시간으로 수행 할 수 있지만 정렬에는 n log (n) 시간이 걸립니다 [차이가 크지는 않지만 여전히;)]. 나는 이것을 구현하는 깔끔한 방법을 생각할 수 없다. [편집 : 깔끔하고 (더러워 보이지만) 빠른 구현이 위에 제공되었습니다.]

다음으로 가장 좋은 방법-디렉토리에서 가장 최근에 편집 한 파일을 찾으려면 각 레벨 1 서브 디렉토리에서 가장 최근에 편집 한 파일을 재귀 적으로 찾으십시오. 이 파일이 서브 디렉토리를 나타내도록하십시오. 이제 레벨 1 파일을 레벨 1 서브 디렉토리의 대표와 함께 정렬하십시오. 각 디렉토리의 레벨 1 파일 수와 하위 디렉토리 수가 거의 일정한 경우이 프로세스는 총 파일 수에 비례하여 확장됩니다.

이것이 이것을 구현하기 위해 생각해 낸 것입니다.

findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .

나는 이것을 실행했고 많은 find: findrecent: No such file or directory오류가 발생했다. 이유 : find의 -exec는 다른 쉘에서 실행됩니다. .bashrc, .xsessionrc에서 findrecent를 정의하려고 시도했지만 도움이되지 않았습니다. 결국 나는 퍼팅에 의지했다

#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;

findrecent내 PATH에서 호출 한 다음 실행하십시오.

나는 이것을 출력하고 기다리지 않고 출력없이 기다렸다. 무한 루프를 처리하지 않았는지 확인하기 위해 파일을 다음과 같이 수정했습니다.

#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;

다시 시도하십시오. 그것은 작동했지만 홈 폴더에서 1 분 35 초가 걸렸습니다. 정렬 및 enzotib의 솔루션은 각각 1.69, 1.95 초가 걸렸습니다!

O (n)의 O (n log (n))보다 우월합니다! 당신은 함수 호출 오버 헤드를 젠장! [또는 오히려 스크립트 호출 오버 헤드]

그러나이 스크립트는 이전 솔루션보다 확장 성이 뛰어나고 Google의 메모리 뱅크에서보다 더 빠르게 실행됩니다.


2

다음 perl과 함께 사용하십시오 find.

 find my_directory -type f -printf '%T@\t%p\n' | perl -ane '@m=@F if ($F[0]>$m[0]); END{print $m[1];}'

가장 큰 에포크 == 마지막 파일이 수정 된 파일의 이름을 얻습니다.


1

거의 유행은 아니지만 Midnight Commander를 사용 하여이 작업을 수행 할 수도 있습니다 . *를 검색하고 결과를 패널화하고 수정 시간을 역순으로 정렬하십시오.

분명히, 그것은 find922000 파일을 포함하는 내 홈 디렉토리 mc가 거의 14 분 안에 정렬 find되었지만 5 시간 미만으로 소비 된 것보다 약간 느립니다. 그러나 몇 가지 이점이 있습니다.

  • 적절한 찾기 호출을 발명하는 데 9 분의 차이보다 더 오래 썼을 것입니다. :)

  • 오류 발생 가능성 감소 (정렬 등에 -r을 지정하지 않은 경우-다시 시작)

  • 파일을 다시 쿼리하지 않고 정렬 순서 등을 변경하여 결과 집합을 재생할 수 있습니다.

  • 결과 집합의 일부 파일에 대해서만 파일 작업을 수행 할 수 있습니다 ( 예 : 크기별로 정렬, 필요하지 않은 큰 파일 몇 개 삭제)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.