특정 디렉터리의 파일 크기 분포를 알고 싶습니다.
참고:파일 크기 분포, 아니요디렉터리 크기. 즉, 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
또는 코드를 추가로 수정하여 여러 디렉터리를 인수로 받아들이고 검색하는 각 디렉터리에 대해 프로세스를 분기할 수 있습니다.
나는 현재 디렉터리의 파일이 한 수준 깊이(재귀 없음)이기를 원한다고 가정합니다.