Cách tìm tổng số tập tin được nhóm theo phần mở rộng


12

Tôi làm việc trên một cụm chia sẻ với các đồng nghiệp khác. Đĩa cứng bị giới hạn (và đôi khi đã đầy), vì vậy thỉnh thoảng tôi dọn dẹp phần của mình. Tôi muốn làm điều này một cách nhanh chóng, vì vậy cho đến bây giờ tôi làm điều này bằng cách lập danh sách các tệp lớn hơn 100 MB cũ hơn 3 tháng và tôi xem liệu tôi có còn cần chúng không.

Nhưng bây giờ tôi đang nghĩ rằng có thể có một thư mục chứa> 1000 tệp nhỏ hơn mà tôi bỏ lỡ, vì vậy tôi muốn có một cách dễ dàng để xem liệu đây có phải là trường hợp không. Từ cách tôi tạo dữ liệu, sẽ giúp có được danh sách tổng kích thước cho mỗi tiện ích mở rộng. Trong ngữ cảnh của câu hỏi này, 'phần mở rộng' là mọi thứ đằng sau dấu chấm cuối cùng trong tên tệp.

Giả sử tôi có nhiều thư mục có nhiều tệp:

folder1/file1.bmp   40 kiB
folder1/file2.jpg   20 kiB
folder2/file3.bmp   30 kiB
folder2/file4.jpg    8 kiB

Có thể tạo một danh sách tổng kích thước tệp trên mỗi phần mở rộng tệp không, như thế này:

bmp 70 kiB
jpg 28 kiB

Tôi không quan tâm đến các tệp mà không có phần mở rộng, vì vậy chúng có thể bị bỏ qua hoặc đặt trong một danh mục.

Tôi đã xem qua các trang của ls, dufind, nhưng tôi không biết đâu là công cụ phù hợp cho công việc này ...


Câu hỏi này sẽ không ổn trên codegolf.stackexchange.com :)
Doug McLean

@DougMcLean: bạn được chào đón để đăng nó ở đó. ;)

Câu trả lời:


16

Trên hệ thống GNU:

find . -name '?*.*' -type f -printf '%b.%f\0' |
  awk -F . -v RS='\0' '
    {s[$NF] += $1; n[$NF]++}
    END {for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e}' |
  sort -n

Hoặc tương tự với việc perltránh -printfphần mở rộng của GNU find(vẫn sử dụng phần mở rộng GNU -print0, nhưng phần mở rộng này hiện được hỗ trợ rộng rãi hơn):

find . -name '?*.*' -type f -print0 |
  perl -0ne '
    if (@s = stat$_){
      ($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{$_}, $_;
      }
    }'

Nó cung cấp một đầu ra như:

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png

Nếu bạn muốn KiB, MiB... hậu tố, đường ống đến numfmt --to=iec-i --suffix=B.

%b*512cung cấp cho việc sử dụng đĩa, nhưng lưu ý rằng nếu các tệp được liên kết cứng nhiều lần, chúng sẽ được tính nhiều lần để bạn có thể thấy sự khác biệt với ducác báo cáo.


Thất bại trên MacOS (tìm: -printf: không rõ chính hoặc toán tử)
MichaelCodes

1
@MichaelCodes, có -printfdành riêng cho GNU find, đó là lý do tại sao tôi nói trên hệ thống GNU .
Stéphane Chazelas

@MichaelCodes, xem chỉnh sửa với một perlthay thế sẽ hoạt động ngay cả trên macOS.
Stéphane Chazelas

1,4,2,17 là gì? Số lượng tập tin cho từng loại?
Jorge Cornejo Bellido

3

Đây là một giải pháp khác:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u | xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -

Phần nhận được các phần mở rộng là:

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u

Tiếp theo tìm kiếm các tệp có phần mở rộng và in nó trên màn hình:

xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;

Tiếp theo chúng tôi muốn giữ phần mở rộng và tổng số:

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq

và giữ nó trên cùng một dòng:

paste - -

Hoạt động trên MacOS.
MichaelCodes

2

Không đẹp như giải pháp của Stephane, nhưng bạn có thể thử

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1

nơi bạn phải chạy cái này cho từng loại tập tin.


1
Giả sử có đủ vài tệp png mà chỉ một lệnh dugọi được chạy. Với GNU xargs, bạn muốn thêm -rcờ để du không chạy khi không có tệp (nếu không, bạn sẽ kết thúc với việc sử dụng đĩa của thư mục hiện tại). Bạn có thể muốn thêm một -type fhoặc ! type dđể tránh đếm các tệp trong thư mục có tên kết thúc .png.
Stéphane Chazelas

điều này chỉ tìm kiếm một phần mở rộng cụ thể.
Raul

Đó là những gì tôi đã viết. Người ta phải gói nó trong một tập lệnh lặp đi lặp lại trên tất cả các tiện ích mở rộng có thể áp dụng để có được giải pháp "hoàn chỉnh".
phản biện
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.