디렉터리 예제의 파일을 나열하는 방법

디렉터리 예제의 파일을 나열하는 방법

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

답변1

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

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

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

 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

여기에 두 개의 메모가 있습니다. 어떤 이유로든 일반적으로 빈 파일 이름도 인쇄하므로 만일을 대비해 샘플 크기를 늘렸습니다. 중요한 점은 검색 경로(~여기)와 최종 명령을 변경하는 것을 잊지 않는 것입니다.

관련 정보