저는 다른 동료들과 공유하는 클러스터에서 작업하고 있습니다. 하드 드라이브 공간은 제한되어 있으므로(가끔 꽉 차는 경우도 있음) 가끔 섹션을 정리합니다. 이 작업을 빨리 수행하고 싶기 때문에 지금까지는 3개월이 넘고 크기가 100MB가 넘는 파일 목록을 만든 다음 해당 파일이 여전히 필요한지 확인하는 방식으로 이 작업을 수행했습니다.
하지만 이제는 누락된 1000개 이상의 작은 파일이 포함된 폴더가 있을 수 있다고 생각하므로 이것이 사실인지 확인할 수 있는 쉬운 방법을 찾고 싶습니다. 데이터를 생성하는 방식에서 이는 각 확장 프로그램의 전체 크기 목록을 얻는 데 도움이 될 것입니다. 이 질문의 맥락에서 "확장자"는 파일 이름의 마지막 점 뒤의 모든 것입니다.
여러 파일이 포함된 여러 폴더가 있다고 가정해 보겠습니다.
folder1/file1.bmp 40 kiB
folder1/file2.jpg 20 kiB
folder2/file3.bmp 30 kiB
folder2/file4.jpg 8 kiB
다음과 같이 각 파일 확장자의 전체 파일 크기를 나열할 수 있습니까?
bmp 70 kiB
jpg 28 kiB
확장자가 없는 파일은 신경 쓰지 않으므로 무시하거나 클래스에 넣을 수 있습니다.
ls
, , du
및 의 매뉴얼 페이지를 살펴봤지만 find
해당 작업에 적합한 도구가 무엇인지 모르겠습니다...
답변1
GNU 시스템에서:
LC_ALL=C find . -name '?*.*' -type f -printf '%b.%f\0' |
LC_ALL=C gawk -F . -v RS='\0' '
{s[$NF] += $1; n[$NF]++}
END {
PROCINFO["sorted_in"] = "@val_num_asc"
for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e
}'
또는 GNU 확장을 perl
피하는 것과 동일합니다 (여전히 GNU 확장을 사용 하지만 이제 이 확장은 더 광범위하게 지원됩니다).-printf
find
-print0
LC_ALL=C find . -name '?*.*' -type f -print0 |
perl -0ne '
if (@s = lstat$_){
($ext = $_) =~ s/.*\.//s;
$s{$ext} += $s[12];
$n{$ext}++;
}
END {
for (sort{$s{$a} <=> $s{$b}} keys %s) {
printf "%15d %4d %s\n", $s{$_}<<9, $n{$_}, $_;
}
}'
다음과 같은 출력이 제공됩니다.
12288 1 pnm
16384 4 gif
204800 2 ico
1040384 17 jpg
2752512 83 png
원하는 경우 KiB
... MiB
접미사를 numfmt --to=iec-i --suffix=B
.
%b*512
디스크 사용량이 나와 있지만 파일이 여러 번 하드 링크된 경우 여러 번 계산되므로 보고된 내용과 차이가 있을 수 있습니다 du
.
1 예외적으로 HP/UX에서 lstat()
/로 보고된 블록 크기는 stat()
512가 아닌 1024입니다. GNU는 find
이를 조정하여 %b
여전히 512바이트 단위의 수를 나타내지만 의 경우 perl
1024를 곱해야 합니다.
답변2
또 다른 해결책은 다음과 같습니다.
find . -type f | egrep -o "\.[a-zA-Z0-9]+$" | sort -u | LC_ALL=C xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -
확장되는 부분은 다음과 같습니다.
find . -type f | egrep -o "\.[a-zA-Z0-9]+$" | sort -u
다음으로 확장자가 있는 파일을 검색하여 화면에 인쇄합니다.
LC_ALL=C xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;
다음으로 내선 번호와 총 번호를 유지하려고 합니다.
egrep "^\.[a-zA-Z0-9]+$|total$" | uniq
같은 줄에 유지하십시오.
paste - -
답변3
Stephen의 솔루션만큼 좋지는 않지만 시도해 볼 수 있습니다.
find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1
각 파일 유형에 대해 이 명령을 실행해야 합니다.
답변4
아직 코멘트를 작성할 만큼 평판 포인트가 충분하지 않기 때문에 여기에서 Stéphane Chazelas의 답변을 확장하겠습니다. 확장자가 없는 파일(예: 실행 파일)을 목록에 포함하려면 다음 명령줄을 사용할 수 있습니다.
find . -name '*' -type f -printf '%b.%f\0' | awk -F . -v RS='\0' '{if (NF==2) $(NF+1)=" "; s[$NF] += $1; n[$NF]++} END {for (e in s) printf "%15d %6d %s\n", s[e]*512, n[e], e}' | sort -rn | numfmt --to=iec-i --suffix=B