문제

Linux에서 디렉토리에서 파일 수를 찾는 빠른 방법을 찾고 있습니다.

디렉토리의 파일 수에서 선형 시간을 취하는 모든 솔루션은 허용되지 않습니다 (예 : "ls | wc -l"및 유사한 것)이 오래 시간이 걸릴 것이므로 (수백질이 수백디렉토리에 수백만 개의 파일의).

디렉토리의 파일 수가 디렉토리 항목을 저장하는 데 사용되는 데이터 구조의 일부로 파일 시스템 구조 (inode Pers Pers) 어딘가에있는 간단한 숫자로 저장해야합니다. 어떻게 할 수 있습니까?이 번호?

편집 : 파일 시스템은 ext3입니다.이 작업을 수행하는 휴대용 방법이 없으면 ext3에 특정한 것을 할 의향이 있습니다.

도움이 되었습니까?

해결책

데이터 구조에 번호가 포함되어야하는 이유는 무엇입니까?나무는 o (1)에서 크기를 알 필요가 없습니다. 요구 사항이 아니라면 (그리고 더 많은 잠금 및 성능 병목 현상이 필요할 수 있음)

나무별로 나는 하위 디르 내용을 포함하지는 않는다는 것을 의미하지는 않지만, 1 - 맥스 덱스가있는 파일은 실제로 목록으로 저장되지 않습니다.

편집 : ext2가 링크 된 목록으로 저장됩니다.

modern ext3은 "NoFollow noreferrer"> 해시 된 b- 나무

은 / bin / ls가 계산하는 것보다 훨씬 더 많은 것을 더 많이 수행하고 실제로 모든 inodes를 스캔합니다.opendir () 및 readdir ()을 사용하여 자신의 C 프로그램이나 스크립트를 작성하십시오.

여기 :

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main()
{
        int count;
        struct DIR *d;
        if( (d = opendir(".")) != NULL)
        {
                for(count = 0;  readdir(d) != NULL; count++);
                closedir(d);
        }
        printf("\n %d", count);
        return 0;
}
.

다른 팁

inotify를 사용하여 모니터링 된 디렉토리에서 파일 만들기 및 링크 해제 파일을 추적하고 녹화 할 수 있습니다.파일 수를 유지하고 현재 파일 수를 즉시 검색하는 데 필요한 총 시간을 배포합니다.

디렉토리의 inode는 일반적으로 파일 수는 디렉토리의 이름 목록과 별도로 필요하지 않으므로 파일 수를 저장하지 않습니다.디렉토리 inode의 링크 횟수는 간접적으로 하위 디렉토리 수를 제공합니다 (st_nlink는 하위 디렉스의 수와 2 개 +)입니다.

디렉토리의 파일 목록을 읽는 것을 제외하고는 선택의 여지가 없습니다.찾기는 LS보다 더 빠르지 않을 수도 있습니다.

디렉토리가 B- 트리를 사용하여 구현되는 경우에도 큰 디렉토리가 문제가되는 이유의 예입니다.

이 작업을 수행하는 휴대용 방법은 없습니다.로우 레벨 파일 프리미티브, 즉 Readdir , 작업 마치 선형 목록입니다.분명히, 그것은 추상화이며 일부 파일 시스템은 카운트를 저장할 수 있습니다.그러나 액세스는 본질적으로 파일 시스템에 따라 다릅니다.

농구를 통해 뛰어 드는 경우 다른 파일 시스템의 각 디렉토리가있을 수 있으며 할당량을 사용하고 "repquota"명령으로 정보를 가져옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top