2010-07-19 3 views
3

나는 리눅스의 디렉토리에있는 파일의 수를 빠르게 찾을 방법을 찾고있다.리눅스의 한 디렉토리에있는 파일 수를 찾는 빠른 방법

디렉토리의 파일 수가 선형 적으로 소요되는 솔루션은 허용되지 않습니다 (예 : "ls | wc -l"및 이와 유사한 것). 시간이 너무 오래 걸릴 수 있습니다 (수십 또는 어쩌면 디렉토리에있는 수억 개의 파일).

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

편집 : 파일 시스템은 ext3입니다. 이 작업을 수행 할 이동식 방법이 없다면 ext3에 특정한 작업을 기꺼이 수행 할 것입니다.

+0

거의 중복 : http : // stackoverflow.co.kr/questions/1427032/fast-linux-file-count-for-large-number-of-files는 표준 ls의 속도를 높이는 방법에 대해 이야기합니다. wc-l – Mark

+0

이것이 어딘가에 일반 숫자로 저장되어 있다고 생각하지 않습니다. (스펙을 읽지는 않았습니다.) 단순히 FS 속도가 느려지므로 신뢰할 수있는 결과를 얻으려면 touch/unlink/mv 등을 동기화해야합니다. 충돌이 발생하면 번호가 손상 될 수 있으므로 어떤 시점에서 파일을 다시 읽어야합니다 . 또한 적어도 내 우분투 노틸러스에서 디렉토리 자체에있는 객체의 수를 캐시합니다. 기본 FS에 숫자가 있으면 그렇게 할 것이라고 생각하지 않습니다. –

+0

내가 궁금한 것은 ... 항목 수와 관련된 디렉토리 항목의 크기 (즉, 상위 디렉토리에서 ls -l을했을 때 디렉토리에 표시되는 크기)입니까? 이 디렉토리의 경우 평소보다 커 보이는 것 같습니다. – HighCommander4

답변

6

왜 데이터 구조에 숫자가 포함되어야합니까? 나무가 O (1)에서 그 크기를 알 필요가 없다. (필요하다면 더 많은 잠금과 성능 병목을 요구할 수있다.)

트리별로 나는 하위 디렉토리 내용을 포함하지 않는다. -maxdepth가 1 인 파일은 실제로 목록으로 저장되지 않는다고 가정합니다.

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

현대 EXT3는

hashed B-Trees은/빈/LS는 계산보다 더 많은 않습니다, 실제로 모든 아이 노드를 검색했다 가졌 구현합니다. opendir()과 readdir()을 사용하여 자신의 C 프로그램이나 스크립트를 작성하십시오. here에서

: 일반적으로 파일 개수가 디렉토리의 이름 목록에서 별도로 필요하지 않기 때문에

#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; 
} 
+2

실제로'ls -a'는'--color' 나'-F'와 같은 다른 옵션을 넘기지 않는 한 프로그램보다 파일 시스템에서 더 많은 데이터를 읽지 않습니다. 'ls -a' 또는 프로그램이'.' 및'..' 항목을 포함하고 있으므로 빈 디렉토리에는 두 개의 항목이 있습니다. Linux에서'ls -A'는'.'과'..'를 건너 뜁니다. – Gilles

+0

그리고 파일 이름은 어디에서 얻습니까? 나는 그들을 얻는 것이 아이 노드를 읽어야한다는 것을 기억하는 것 같다. 하지만 오랜 시간이 지났습니다. 당신 말이 맞을 수도 있습니다. –

+2

@Gilles가 맞습니다. 파일 이름은 파일 inode가 아니라 디렉토리에 있습니다 (결국, 하나의 파일 inode가 많은 이름을 가질 수 있습니다). 파일 이름은'd-> d_name'에 작성한 프로그램에서 사용할 수 있습니다. – caf

0

이 작업을 수행 할 수있는 휴대용 방법이 없습니다. 낮은 수준의 파일 프리미티브 (예 : readdir)는 인 것처럼 인 것처럼 선형 목록입니다. 분명히 그것은 추상화이며, 일부 파일 시스템은 카운트를 저장할 수 있습니다. 그러나 파일 시스템에 액세스하는 것은 본질적으로 파일 시스템에 따라 다릅니다.

+0

휴대용 방식이 필요하지 않습니다. 나는 그저 길을 필요로합니다. 중요한 경우 파일 시스템은 ext3입니다. – HighCommander4

1

그 안에 파일의 수를 저장하지 않는 디렉토리의 아이 노드. 디렉토리 inode의 링크 수는 간접적으로 하위 디렉토리의 수를 제공합니다 (st_nlink은 하위 디렉토리의 수에 2를 더한 값 임).

디렉토리의 전체 파일 목록을 읽는 것 외에는 선택의 여지가 없다고 생각합니다. ls보다 빠르거나 빠를 수도 있습니다.

이것은 B 트리를 사용하여 디렉토리를 구현할 때도 큰 디렉토리가 문제가되는 이유의 예입니다.

0

만약 당신이 다른 파일 시스템에있는 각 디렉토리를 가질 수 있고, 할당량을 사용하고, "repquota"명령으로 정보를 얻을 수 있습니다.

2

inotify를 사용하여 모니터링되는 디렉토리에서 파일 작성 및 연결 해제 이벤트를 추적하고 기록 할 수 있습니다. 파일 수를 유지하는 데 필요한 총 시간을 분배하고 현재 파일 수를 즉시 검색 할 수 있습니다.

관련 문제