로드가 많은 디렉토리에서 가장 오래된 파일을 (재귀적으로) 찾는 가장 저렴한 방법

로드가 많은 디렉토리에서 가장 오래된 파일을 (재귀적으로) 찾는 가장 저렴한 방법

디렉터리(아래의 모든 디렉터리 포함)에서 가장 오래된 파일을 찾는 가장 저렴한 방법은 무엇입니까? 디렉터리가 SAN에 의해 ​​지원되고 부하가 높다고 가정합니다.

과부하 상태에서 "ls"가 잠겨 시스템 성능이 저하될 수 있다는 우려가 있습니다.

편집: Find는 간단한 테스트 사례에서 매우 잘 수행되었습니다. SSD 드라이브에 있는 400GB 파일 중에서 가장 오래된 파일을 찾는 데 1/20초가 걸렸습니다. 하지만 이것은 무부하 상태의 MacBook Pro이므로 약간의 사과와 오렌지 테스트 사례입니다.

그런데, 그러한 명령의 구현(기본 알고리즘)을 찾는 가장 좋은 방법은 무엇입니까?

답변1

그리고 zsh:

oldest=(**/*(.DOm[1]))

가장 오래된 일반 파일의 경우( zsh시간 해상도는 초)

GNU 도구 사용:

(export LC_ALL=C
 find . -type f -printf '%T@\t%p\0' |
   sort -zg | tr '\0\n' '\n\0' | head -n 1 |
   cut -f2- | tr '\0' '\n')

답변2

외부 프로세스의 수를 최소화하려면 적절한 find.stat()

Perl에서의 시도는 다음과 같습니다.

find2perl -eval 'BEGIN { our ($filename, $oldest); }
    my @s=stat(_); if (! defined $::oldest || $s[9] < $::oldest) {
        $::oldest=$s[9]; $::filename = $File::Find::name }
    END { print "$::filename\n" }' | perl

내 테스트에서는 적당히 큰 디렉터리(129019개 노드)에서 실제로 @StephaneChazelas의 "GNU 도구" 버전보다 약 50% 느리지만 어떤 경우에는 특히 매우 큰 디렉터리의 경우 더 잘 작동한다는 것을 알 수 있습니다.

관련 정보