디렉터리(아래의 모든 디렉터리 포함)에서 가장 오래된 파일을 찾는 가장 저렴한 방법은 무엇입니까? 디렉터리가 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% 느리지만 어떤 경우에는 특히 매우 큰 디렉터리의 경우 더 잘 작동한다는 것을 알 수 있습니다.