Solusi
Dengan menyediakan opsi -c
(atau --total
) ke du(1)
, Anda dapat menginstruksikannya untuk menghasilkan total keseluruhan. Jika implementasi Anda dari du(1)
mendukung salah satu opsi ini, Anda dapat mencapai efek yang diinginkan menggunakan perintah berikut:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
EDIT: Perhatikan bahwa jika jumlah file melebihi jumlah maksimum parameter yang diizinkan oleh sistem Anda, find
mungkin masih mengeksekusi command
beberapa kali. Beberapa implementasi du(1)
juga mendukung pembacaan nama file dari file, yang tidak mengalami batasan yang disebutkan:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Penjelasan
Perbedaan antara semantik -exec command {} \;
dan -exec command {} +
adalah sebagai berikut:
-
command {} \;
mengeksekusicommand
satu kali untuk setiap hasilfind
. Nama jalur dari hasil diteruskan sebagai ganti{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
mengeksekusicommand
, ketika semua hasil telah diambil. Nama jalur dari hasil diteruskan sebagai ganti{}
.$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
-print0
opsi menyebabkan find(1)
untuk mencetak nama file yang ditemukan ke keluaran standar yang dipisahkan oleh karakter nol, dan kode --files0-from
opsi menyebabkan du(1)
untuk membaca nama file yang dipisahkan null. Tidak seperti karakter baris baru, karakter null mungkin tidak muncul dalam nama file, sehingga hasilnya tidak ambigu.
Untuk mempelajari lebih lanjut tentang opsi du(1)
dan find(1)
, Anda harus berkonsultasi dengan masing-masing halaman manual:
$ man du
$ man find
Coba ini:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
Perintah aslinya adalah memberikan du satu argumen, lalu menjalankannya, hingga melewati semua argumen. Dengan cara ini, Anda cukup memberikan semua argumen sekaligus, lalu memotong ukuran yang terpisah, dan hanya menyisakan totalnya. Anda dapat menghapus pipa dan ekor untuk menunjukkan ukuran setiap file jika Anda mau.
Anda dapat mencoba ini:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total