Ukuran semua file dari ekstensi tertentu di pohon direktori

16

Saya ingin tahu ukuran file dengan ekstensi .o (file objek) di folder Beranda saya.

Saya dapat menemukan semua file objek menggunakan

find . -name '*.o'

Bagaimana saya bisa menghitung ukuran total file-file itu?

alhelal
sumber

Jawaban:

24

Anda sedang mencari pipa ( |). Mereka adalah cara menghubungkan beberapa perintah dan meneruskan output dari satu perintah sebagai input ke perintah lainnya. Dalam hal ini, Anda ingin meneruskan semua nama file yang Anda temukan sebagai input du(yang menghitung ukuran). Namun, karena dumengharapkan nama file dan hasilnya findhanya daftar teks (ya, teks terdiri dari nama file, tetapi dutidak bisa tahu itu, semua yang dilihatnya adalah teks), Anda perlu menggunakan sesuatu seperti xargsyang akan mengambil masing-masing file baris teks, memperlakukannya sebagai nama file dan meneruskannya ke du. Menyatukan semua ini, kita dapatkan:

find . -name "*.o" | xargs du -sch
  • Anda harus selalu mengutip pola yang Anda berikan find(seperti yang saya lakukan di atas "*.o":). Jika tidak, shell akan memperluas *.oke nama file yang cocok di direktori saat ini. Ini berfungsi dalam hal ini hanya karena Anda tidak memiliki file yang cocok.

  • The -schbendera untuk dudidokumentasikan di man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

Perhatikan, bagaimanapun, bahwa ini akan gagal untuk nama file yang mengandung spasi putih. Ini hampir pasti tidak akan menjadi masalah untuk file objek, tetapi di masa depan, jika Anda juga perlu berurusan dengan spasi, gunakan:

find . -name "*.o" -print0 | xargs -0 du -sch

The -print0merek findmencetak garis NULL dipisahkan dan -0merek xargsmengambil garis seperti input.

Atau, Anda dapat findmencetak ukurannya sendiri dan kemudian menjumlahkannya:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

Ini juga akan mengatasi masalah yang disebutkan oleh @Serg dalam komentar di mana ada terlalu banyak argumen dan perintah dipecah menjadi perintah yang terpisah.


Jika Anda menggunakan bash(mungkin memang demikian), ada cara yang lebih sederhana:

shopt globstar 
du -sch **/*.o

The shopt globstarmerek perintah **cocok dengan semua file dan atau lebih subdirektori. Setelah mengaktifkannya, **/*.oakan cocok dengan semua file (dan direktori) yang namanya berakhir .o, sehingga kami dapat meneruskannya langsung ke du.

Perhatikan bahwa, tidak seperti findpendekatan, ini tidak akan cocok dengan file tersembunyi (yang namanya dimulai dengan a .). Untuk mencocokkannya juga, lakukan:

shopt -s dotglob globstar
du -sch **/*.o
terdon
sumber
Ada sedikit masalah dengan yang pertama. Ada yang namanya MAXARGS. Jadi akan ada beberapa iterasi du, dan akan menghasilkan beberapa totalbaris. Contohnya: paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy
@Serg benar. Saya menambahkan opsi lain yang menghindari itu.
terdon
8

Gunakan -exec flag untuk menjalankan duperintah dengan ;(artinya per setiap file)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

Output sampel:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

findbersifat rekursif - artinya berjalan melalui semua subdirektori. Jika Anda hanya ingin mendapatkan total semua *.ofile di direktori saat ini, lakukan saja

du -b -c *.o
Sergiy Kolodyazhnyy
sumber
0

dengan perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Ukuran semua file PDF yang tidak disembunyikan di direktori saat ini.

kasar
sumber
1
OK, tapi OP sedang mencari .ofile dan mereka bisa di subdirektori. Anda mungkin juga ingin menambahkan }{sebelumnya print $sumuntuk menghindari mencetak jumlah untuk setiap iterasi. Kami hanya menginginkan yang terakhir.
terdon