Cara menampilkan hanya ukuran file total ekstensi tertentu dengan perintah `du`

11

Saya memiliki ratusan file pdf dan file html di direktori. Dan saya ingin tahu ukuran total file pdf.

Dengan perintah du -ch /var/foosaya dapat melihat ukuran file total tetapi saya hanya perlu baris terakhir, ukuran total.

Jika direktori hanya berisi file pdf saya dapat menggunakan -sopsi, tetapi opsi ini tidak dapat digunakan saat ini.

Bagaimana saya bisa mendapatkan hanya ukuran total jenis file tertentu?

pasir besi
sumber
Tidak bisakah kamu menggunakan suka du -sh /foo/*.pdf?
bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Jawaban:

10

Dengan GNU du(yaitu pada Linux yang tidak tertanam atau Cygwin), Anda dapat menggunakan --excludeopsi untuk mengecualikan file yang tidak ingin Anda cocokkan.

du -s --exclude='*.html' /var/foo

Jika Anda ingin mencocokkan *.pdffile secara positif , Anda harus menggunakan beberapa metode lain untuk membuat daftar file, dan dusetidaknya akan menampilkan satu baris output per argumen, ditambah total besar dengan opsi -c. Anda dapat menelepon tailuntuk menghapus semua kecuali baris terakhir, atau sed untuk menghapus kata "total" juga. Untuk menghitung file dalam satu direktori itu, gunakan wildcard di shell.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Jika Anda perlu menelusuri file dalam subdirektori juga, gunakan find, atau gunakan **/pola jika shell Anda mendukungnya. Untuk **/, dalam bash, jalankan pertama shopt -s extglob, dan perhatikan bahwa versi bash hingga 4.2 akan melintasi tautan simbolik ke direktori; di zsh, ini berfungsi di luar kotak.

du -sc /var/foo/**/*.pdf | tail -n1

Komplikasi tambahan dengan versi find adalah bahwa jika ada terlalu banyak file, findakan berjalan dulebih dari sekali, untuk tetap di bawah batas panjang baris perintah. Dengan metode wildcard, Anda akan mendapatkan kesalahan jika itu terjadi ("batas panjang baris perintah terlampaui"). Kode berikut mengasumsikan bahwa Anda tidak memiliki nama file yang cocok yang berisi baris baru.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
(mungkin bukan masalah dalam praktek tetapi catatan yang --exclude='*.html'akan menyebabkan /var/foo/dir.html/foo.pdftidak dihitung karena pengecualian juga mempengaruhi traversal direktori; juga, penggunaan disk dari direktori termasuk /var/foodirinya akan diperhitungkan)
Stéphane Chazelas
3

Anda dapat membiarkan shell membuka file:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

Namun seperti yang Anda lihat ini menunjukkan filesizes sekitar 1000 kali seperti yang baru saja dibuat. Opsi yang lebih baik menggunakan -bopsi ini:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

File ukuran besar masih akan ditampilkan dalam bentuk yang dapat dibaca manusia — mis 173K.

Anthon
sumber
dumenunjukkan penggunaan disk setiap file (pada kebanyakan sistem file, itu ukuran file dibulatkan ke kelipatan berikutnya dari ukuran blok). Dengan opsi -b, dumenunjukkan ukuran setiap file.
Gilles 'SANGAT berhenti menjadi jahat'