파일 크기 분포를 얻는 방법은 무엇입니까?

파일 크기 분포를 얻는 방법은 무엇입니까?

특정 디렉터리의 파일 크기 분포를 알고 싶습니다.

참고:파일 크기 분포, 아니요디렉터리 크기. 즉, 60바이트 파일이 25개, 12587바이트 파일이 50개, 57k바이트 파일이 2개 등이 있다는 것을 알고 싶다는 의미입니다.

명령줄(예: 원격 시스템에서)을 통해 그래프하기 쉬운 형식으로 데이터를 수집할 수 있다면 보너스 포인트가 됩니다.

답변1

파일을 나열하고 목록에서 크기(바이트 단위)를 추출한 후 정렬하고 각 크기의 발생 횟수를 계산합니다.

find /my/directory -type f -exec ls -l {} + | cut -d' ' -f5 | sort -n | uniq -c
  • 별로 효율적이지 않음
  • 파일이 많은 경우 중간 결과를 임시 파일에 저장하고 다른 임시 파일로 정렬한 다음 "uniq"하는 것이 좋습니다.
  • 여기서는 숫자 정렬을 사용하므로 출력은 파일 크기에 따라 오름차순으로 정렬되지만(괜찮습니다) 동일한 행이 함께 그룹화되는 한 어떤 정렬도 괜찮습니다.
  • 결과를 파이프로 연결하여 awk '{ print $1 "," $2 }'선택한 플롯 도구에서 사용할 CSV 파일을 얻습니다(스프레드시트 도구도 작동함).

답변2

Luke404의 GNU 찾기 변형:

find . -type f -printf '%s\n' | sort -n | uniq -c

답변3

이 Perl 코드는 다음과 같은 경우에 도움이 될 수 있습니다.

@files = grep {-f} glob "*"; #List files in the current directory   
%files;  
for(@files)  
{  
  chomp (my $size = \`du -h \"$_\"`);  
  $size=~ s/\s+.*//;  #Remove the file name from the output of du  
  $files{$size}++;  #  Add an entry to the hash  
}  
print "Size,Count\n"; # Print a header  
print "${\_},$files{$_}\n" for(keys %files); # Print info in CSV format  

다음 사항에 유의하세요.

  • 이 코드는 파일을 크기별로 정렬하려고 시도하지 않습니다(서브루틴이 필요할 수 있음).
  • 나는 사람이 읽을 수 있는 출력을 얻기 위해 du대신 Perl의 연산자를 사용하고 있습니다.-s
  • 현재 디렉터리가 아닌 다른 디렉터리의 내용을 나열하려면 원하는 디렉터리의 이름을 명령줄 인수로 바꾸고 제공하십시오 glob "*".glob "$ARGV[0]/*"
  • 일괄 작업으로 여러 디렉터리의 내용을 나열하려면 이 코드를 list_dir.pl다음과 같이 저장하고 bash 래퍼를 사용할 수 있습니다.

    list_dir.pl dir1 > dir1_list.csv  
    list_dir.pl dir2 > dir2_list.csv
    
  • 또는 코드를 추가로 수정하여 여러 디렉터리를 인수로 받아들이고 검색하는 각 디렉터리에 대해 프로세스를 분기할 수 있습니다.

나는 현재 디렉터리의 파일이 한 수준 깊이(재귀 없음)이기를 원한다고 가정합니다.

관련 정보