Cara menemukan total file yang dikelompokkan berdasarkan ekstensi

12

Saya mengerjakan cluster yang dibagikan dengan kolega lain. Hard disk terbatas (dan sudah penuh pada beberapa kesempatan), jadi saya sesekali membersihkan bagian saya. Saya ingin melakukan ini dengan cepat, jadi sampai sekarang saya melakukan ini dengan membuat daftar file yang lebih besar dari 100 MB lebih tua dari 3 bulan, dan saya melihat apakah saya masih membutuhkannya.

Tetapi sekarang saya berpikir bahwa mungkin ada folder dengan> 1000 file lebih kecil yang saya lewatkan, jadi saya ingin mendapatkan cara mudah untuk melihat apakah ini masalahnya. Dari cara saya menghasilkan data, akan membantu untuk mendapatkan daftar ukuran total per ekstensi. Dalam konteks pertanyaan ini, 'ekstensi' sebagai segala sesuatu di belakang titik terakhir dalam nama file.

Misalkan saya memiliki banyak folder dengan banyak file:

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

Apakah mungkin membuat daftar ukuran file total per ekstensi file, jadi seperti ini:

bmp 70 kiB
jpg 28 kiB

Saya tidak peduli tentang file tanpa ekstensi, sehingga dapat diabaikan atau dimasukkan ke dalam satu kategori.

Saya sudah membaca halaman manual ls, dudan find, tapi saya tidak tahu apa alat yang tepat untuk pekerjaan ini ...

countermode
sumber
Pertanyaan ini tidak akan keliru di codegolf.stackexchange.com :)
Doug McLean
@DougMcLean: Anda dipersilakan mempostingnya di sana. ;)

Jawaban:

16

Pada sistem 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

Atau sama dengan perl, menghindari -printfekstensi GNU find(masih menggunakan ekstensi GNU -print0,, tetapi yang ini lebih banyak didukung saat ini):

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{$_}, $_;
      }
    }'

Ini memberikan output seperti:

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

Jika Anda ingin KiB, MiB... sufiks, pipa ke numfmt --to=iec-i --suffix=B.

%b*512memberikan penggunaan disk, tetapi perhatikan bahwa jika file ditautkan beberapa kali, mereka akan dihitung beberapa kali sehingga Anda dapat melihat perbedaan dengan dulaporan apa .

Stéphane Chazelas
sumber
Gagal pada MacOS (temukan: -printf: primer atau operator tidak dikenal)
MichaelCodes
1
@MichaelCodes, ya -printfkhusus untuk GNU find, itulah sebabnya saya katakan pada sistem GNU .
Stéphane Chazelas
@MichaelCodes, lihat edit dengan perlalternatif yang seharusnya berfungsi bahkan pada macOS.
Stéphane Chazelas
Apa itu 1,4,2,17? Jumlah file untuk setiap jenis?
Jorge Cornejo Bellido
3

Ini solusi lain:

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 - -

Bagian yang mendapatkan ekstensi adalah:

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

Selanjutnya cari file dengan ekstensi dan cetak di layar juga:

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

Selanjutnya kita ingin menyimpan ekstensi dan totalnya:

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

dan simpan di baris yang sama:

paste - -
vahbuna
sumber
Bekerja pada MacOS.
MichaelCodes
2

Tidak sebagus solusi Stephane, tetapi Anda bisa mencobanya

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

di mana Anda harus menjalankan ini untuk setiap jenis file.

countermode
sumber
1
Itu mengasumsikan ada beberapa file png cukup bahwa hanya satu dudoa dijalankan. Dengan GNU xargs, Anda ingin menambahkan -rflag sehingga du tidak berjalan ketika tidak ada file (jika tidak, Anda akan berakhir dengan penggunaan disk direktori saat ini). Anda mungkin ingin menambahkan -type fatau ! type duntuk menghindari penghitungan file yang ada di direktori yang namanya berakhir .png.
Stéphane Chazelas
ini hanya mencari satu ekstensi spesifik.
Rahul
Itu yang saya tulis. Kita harus membungkusnya dalam skrip yang beralih ke semua ekstensi yang berlaku untuk mendapatkan solusi "lengkap".
countermode