Jawaban:
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
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
dengan perl:
perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf
Ukuran semua file PDF yang tidak disembunyikan di direktori saat ini.
.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.
du, dan akan menghasilkan beberapatotalbaris. Contohnya: paste.ubuntu.com/23092752