디렉토리의 파일 샘플을 나열하는 방법

디렉토리의 파일 샘플을 나열하는 방법

수십만 개의 파일이 포함된 디렉터리가 있습니다.
디렉터리에 있는 모든 파일을 처리하지 않고 이러한 파일의 샘플(예: 10개 파일)을 나열해야 하므로 처리 시간이 너무 많이 걸립니다.

답변1

파일 시스템 수준에서도 어떤 방식으로든 모두 읽지 않고는 전체 파일 목록에서 샘플링할 수 없다고 생각합니다.

하지 않는 한해당 이름은 패턴(예: fileXXXXXXX)을 따르며, 이 경우 파일에 액세스하기 전에 임의의 이름 목록을 미리 생성할 수 있습니다. 그렇게 많은 양의 파일의 경우 이름이 무작위라면 이상할 것입니다.

하지만 당신이 그렇게 운이 좋지 않다고 가정해보자. 을 사용하는 것이 null로 출력을 이스케이프할 수 있어 파일 이름의 비표준 문자에 영향을 받지 않도록 하기 때문에 find선호됩니다 . ls모든 파일을 읽고 싶지 않다면 목록 시작 부분에 있는 파일을 사용하는 것이 가장 빠릅니다. 더 나은 샘플을 얻으려면 먼저 더 큰 샘플( $oversamplesize아래)을 사용한 다음 $samplesize거기에서 크기를 무작위로 하위 선택합니다. 나는 널 구분자를 제대로 만들 sort -R거나 제대로 작동 하지 못했기 shuf때문에 셔플링과 최종 선택은 다음과 같이 수행됩니다 awk.

 find ~ -type f -print0 | 
 grep --null --null-data -m ${oversamplesize:-100} . | 
 awk -v samplesize=${oversamplesize:-11} -vRS='\0' -vORS='\0' \
   '{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' | 
 xargs -0 echo # echo here being just a dummy

여기에 두 개의 메모가 있습니다. 어떤 이유로 빈 파일 이름도 인쇄하는 경우가 많기 때문에 만일을 대비해 샘플 크기를 늘렸습니다. 사소한 참고 사항은 검색 경로(~ 여기)와 최종 명령을 변경하는 것을 잊지 않는 것입니다.

관련 정보