Bagaimana cara menemukan file dan total ukurannya?

10

Saya ingin menemukan serangkaian file (berdasarkan ekspresi wildcard) dan total penggunaan disk mereka.

Sesuatu seperti ini:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

Pekerjaan ini. Tapi itu tidak membuahkan hasil yang saya cari. Ini daftar ruang yang digunakan oleh setiap file, seperti finditerasi melalui mereka.

Yang saya inginkan adalah total duuntuk semua file yang ditemukan.

Paul
sumber

Jawaban:

11

Larutan

Dengan memberikan opsi -c(atau --total) kepada du(1), Anda dapat menginstruksikannya untuk menghasilkan jumlah total. Jika implementasi Anda du(1)mendukung salah satu dari opsi ini, Anda dapat mencapai efek yang diinginkan menggunakan perintah berikut:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

Penjelasan

Perbedaan antara semantik -exec command {} \;dan -exec command {} +adalah sebagai berikut:

  • command {} \;dijalankan commandsatu kali untuk setiap hasil find. Pathname dari hasil dilewatkan sebagai ganti {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
  • command {} +dijalankan command, ketika semua hasil telah diambil. Pathnames dari hasil dilewatkan sebagai gantinya {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3

Untuk mempelajari lebih lanjut tentang opsi du(1)dan find(1), Anda harus berkonsultasi dengan manual masing-masing.

Witiko
sumber
2
Anda mungkin berakhir dengan banyak total jika jumlah file penting (1K +) karena jumlah batasan argumen baris perintah.
ychaouche
Saya dapat mengonfirmasi @ychaouche, saya mendapatkan masalah saat mencoba menilai ukuran lebih dari 30k file.
Adrien H
Jika itu masalah, beberapa implementasi dari du(1)juga mendukung membaca nama file dari file: find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames.
Witiko
4

Coba ini:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

Perintah aslinya adalah memberikan du satu argumen, kemudian mengeksekusinya, sampai melewati semua argumen. Dengan cara ini, Anda cukup memberikan semua argumen sekaligus, kemudian memotong ukuran yang terpisah, dan hanya menyisakan total. Anda dapat menghapus pipa dan ekor untuk menunjukkan ukuran setiap file jika Anda mau.

Andre S.
sumber
Ini tidak akan menghasilkan hasil yang benar dengan nama path yang mengandung spasi. Cara yang tepat untuk melakukan ini adalah menggunakan -exec du -c {} +opsi find, yang akan melewatkan nama path yang tidak diubah du.
Witiko
3

Anda dapat mencoba ini:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total
Skush
sumber
2

Saya akan findmencetak sendiri ukurannya, dan menggunakan alat lain untuk menghitung total:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

Jika Anda juga ingin melihat nama file:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'
glenn jackman
sumber
1

Satu liner yang bekerja untuk mendapatkan total Gigabyte pada sebagian besar sistem:

echo "$ ((($ (temukan. -nama 'flibble *' -time +90 -type f -printf '% k +') 0) / 1024/1024)) GB"

Robert Boyd
sumber