Bagaimana cara membuat daftar ukuran setiap file dan direktori dan mengurutkan berdasarkan ukuran di Bash?

108

Saya menemukan bahwa tidak ada cara yang mudah untuk mengetahui ukuran direktori di Bash?

Saya ingin bahwa ketika saya mengetik ls -<some options>, ia dapat mencantumkan semua jumlah ukuran file direktori secara rekursif dan file pada saat yang sama dan mengurutkan berdasarkan urutan ukuran.

Apakah itu mungkin?

Kit Ho
sumber
2
Apa sebenarnya yang Anda maksud dengan "ukuran" direktori? Jumlah file di bawahnya (secara rekursif atau tidak)? Jumlah ukuran file di bawahnya (secara rekursif atau tidak)? Ukuran disk direktori itu sendiri? (Direktori diimplementasikan sebagai file khusus yang berisi nama file dan informasi lainnya.)
Keith Thompson
harus Jumlah ukuran file di bawahnya secara rekursif
Kit Ho
1
@Kit: Kalau begitu dujawabannya.
Keith Thompson
Perintah @Keompson @Kito dumemperkirakan penggunaan ruang file sehingga Anda tidak dapat menggunakannya jika Anda ingin mendapatkan ukuran yang tepat.
ztank1013
@ ztank1013: Tergantung pada apa yang Anda maksud dengan "ukuran yang tepat", du(setidaknya versi coreutils GNU) mungkin memiliki opsi untuk menyediakan informasi.
Keith Thompson

Jawaban:

218

Cukup navigasikan ke direktori dan jalankan perintah berikut:

du -a --max-depth=1 | sort -n

ATAU tambahkan -h untuk ukuran yang dapat dibaca manusia dan -r untuk mencetak direktori / file yang lebih besar terlebih dahulu.

du -a -h --max-depth=1 | sort -hr
Pengembang
sumber
23
du -hmembutuhkan sort -hjuga, untuk memastikan bahwa, katakan 981Murutkan sebelumnya 1.3G; dengan sort -nhanya angka-angka akan diperhitungkan dan mereka akan menjadi cara putaran yang salah.
Smylers
Ini tidak mencantumkan ukuran file individual dalam direktori saat ini, hanya ukuran subdirektorinya dan ukuran total direktori saat ini. Bagaimana Anda akan menyertakan file individual dalam output juga (untuk menjawab pertanyaan OP)?
Erik Trautman
@ErikTrautman untuk mencantumkan file yang juga perlu Anda tambahkan -adan gunakan --alldaripada --max-depth=1seperti itudu -a -h --all | sort -h
Franco
Hebat! Saya telah melakukan sesuatu yang lamer selama beberapa tahun sekarang. :)
Colby Blair
6
sort -hhanya bekerja pada versi GNU / Linux, tidak beruntung dengan BSD / OS X.
djule5
20

Tampaknya --max-depthopsi tidak ada dalam versi duperintah Mac OS X. Anda dapat menggunakan yang berikut ini sebagai gantinya.

du -h -d 1 | sort -n

cevaris
sumber
Ternyata, tapi tidak mengherankan.
Josh Habdas
20
du -s -- * | sort -n

(ini tidak akan menampilkan file tersembunyi (.dotfiles))

Gunakan du -smuntuk unit Mb dll Saya selalu menggunakan

du -smc -- * | sort -n

karena total baris ( -c) akan berakhir di bagian bawah karena alasan yang jelas :)

PS:

  • Lihat komentar untuk menangani dotfiles
  • Saya sering menggunakan misalnya 'du -smc / home / / | sort -n | tail 'untuk merasakan di mana tepatnya potongan-potongan besar itu berada
lihat
sumber
5
du --max-depth=1|sort -natau find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nuntuk menyertakan dotfiles juga.
Arnaud Le Blanc
@arnoud: Saya juga menggunakannya, tapi sepertinya itu bukan tambahan yang tepat untuk pertanyaan ini (/ jawaban) :)
lihat
@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -njika beberapa jalur yang ditemukan dapat berisi spasi.
Lri
1
Ini adalah varian yang bagus untuk mendapatkan tampilan terbesar yang dapat dibaca manusia:sudo du -smch * | sort -h | tail
marsbard
16

Perintah

du -h --max-depth=0 * | sort -hr

Keluaran

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Penjelasan

  • du menampilkan "penggunaan disk"
  • h adalah untuk "dapat dibaca manusia" (keduanya, in sort dan in du)
  • max-depth=0Berarti dutidak akan menampilkan ukuran subfolder (hapus itu jika Anda ingin menampilkan semua ukuran setiap file di setiap sub-, sub-sub, ..., folder)
  • r adalah untuk "membalikkan" (file terbesar dulu)

ncdu

Ketika saya sampai pada pertanyaan ini, saya ingin membersihkan sistem file saya. Alat baris perintah ncdujauh lebih cocok untuk tugas ini.

Instalasi di Ubuntu:

$ sudo apt-get install ncdu

Pemakaian:

Ketik saja ncdu [path]di baris perintah. Setelah beberapa detik untuk menganalisis jalur, Anda akan melihat sesuatu seperti ini:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Hapus elemen yang saat ini disorot dengan d, keluar dengan CTRL+c

Martin Thoma
sumber
Anda juga bisa menulis du -hs * | sort -jam. -s (ringkasan) sama dengan --max-depth = 0
rasmusx
5

ls -Sdiurutkan berdasarkan ukuran. Kemudian, untuk memperlihatkan ukuran juga, ls -lSberikan tampilan long ( -l), diurutkan berdasarkan size ( -S). Saya biasanya menambahkan -hjuga, agar lebih mudah dibaca, jadi ls -lhS,.

Thanatos
sumber
1
Ah, maaf, itu tidak jelas dari postingan Anda. Anda ingin du, sepertinya seseorang telah mempostingnya. @sehe: Bergantung pada definisi real Anda - ini menunjukkan jumlah ruang yang digunakan direktori untuk menyimpan dirinya sendiri. (Hanya saja tidak juga menambahkan ukuran subentri.) Ini bukan nomor acak, dan tidak selalu 4KiB.
Thanatos
1

Sederhana dan cepat:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* membutuhkan GNU Parallel .

pje
sumber
0

Saya pikir saya mungkin sudah tahu apa yang ingin Anda lakukan. Ini akan memberikan daftar yang diurutkan dari semua file dan semua direktori, diurutkan berdasarkan ukuran file dan ukuran konten dalam direktori.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
dvorak
sumber
Tidak apa-apa, dia telah menyajikan solusi yang jauh lebih sederhana. Saya belajar sesuatu yang baru setiap hari!
dvorak
Saya tidak berpikir menggunakan duadalah pilihan, Ini hanya akan memberi Anda hasil perkiraan.
ztank1013
0

[versi yang disempurnakan]
Ini akan menjadi lebih cepat dan tepat daripada versi awal di bawah ini dan akan menampilkan jumlah dari semua ukuran file dari direktori saat ini:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

yang stat -c %sperintah pada file akan kembali ukurannya dalam bytes. The trperintah di sini digunakan untuk mengatasi xargsketerbatasan perintah (rupanya pipa untuk xargsadalah hasil pemisahan pada baris lagi, melanggar logika perintah saya). Oleh karena tritu dilakukan perawatan penggantian line feed dengan +tanda (plus). sedmemiliki satu-satunya tujuan untuk menghapus +tanda terakhir dari string yang dihasilkan untuk menghindari keluhan dari perintah akhir bc(kalkulator dasar) yang, seperti biasa, melakukan penghitungan.

Pertunjukan: Saya mengujinya di beberapa direktori dan lebih dari ~ 150.000 file teratas (jumlah file saat ini dari kotak fedora 15 saya) yang saya yakini adalah hasil yang luar biasa:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Untuk berjaga-jaga jika Anda ingin membuat perbandingan dengan du -sb /perintah, itu akan menampilkan perkiraan penggunaan disk dalam byte ( -bopsi)

# du -sb /
12684646920 /

Seperti yang saya harapkan, ini sedikit lebih besar dari perhitungan perintah saya karena duutilitas mengembalikan ruang yang dialokasikan dari setiap file dan bukan ruang yang dikonsumsi sebenarnya.

[versi awal]
Anda tidak dapat menggunakan duperintah jika Anda perlu mengetahui jumlah pasti dari folder Anda karena (sesuai kutipan halaman manual) dumemperkirakan penggunaan ruang file. Oleh karena itu, ini akan membawa Anda ke hasil yang salah, perkiraan (mungkin mendekati ukuran jumlah tetapi kemungkinan besar lebih besar dari ukuran sebenarnya yang Anda cari).

Saya pikir mungkin ada cara berbeda untuk menjawab pertanyaan Anda, tetapi ini milik saya:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Ia menemukan semua file di bawah. direktori (ubah. dengan direktori apa pun yang Anda suka), juga file tersembunyi disertakan dan (menggunakan xargs) keluaran nama mereka dalam satu baris, kemudian menghasilkan daftar rinci menggunakan ls -l. Ini (kadang-kadang) keluaran besar disalurkan ke perintah cut dan hanya bidang kelima ( -f5), yang merupakan ukuran file dalam byte yang diambil dan lagi disalurkan xargsyang menghasilkan lagi satu baris ukuran dipisahkan oleh kosong. Sekarang lakukan sihir sed yang menggantikan setiap ruang kosong dengan tanda plus ( +) dan akhirnya bc(kalkulator dasar) melakukan perhitungan matematika.

Mungkin perlu penyetelan tambahan dan Anda mungkin memiliki lsperintah yang mengeluh tentang daftar argumen yang terlalu panjang.

ztank1013
sumber
jika direktori terlalu besar, itu menutup untuk waktu yang lama, coba bekerja pada direktori home Anda: p
Kit Ho
@KitHo yah, saya khawatir tidak ada cara yang mudah dan cepat untuk mendapatkan hasil yang tepat tanpa mencari setiap file dan menambahkan ukurannya, oleh karena itu kemalasan perintah terutama tergantung pada berapa banyak file yang ada di bawah direktori yang dicari ... Tapi saya percaya di sana adalah margin untuk perbaikan ... tantangan yang bagus!
ztank1013
@KitHo hai, lihat versi yang disempurnakan dalam jawaban saya ... dan beri tahu saya tentu saja!
ztank1013
0

Solusi sederhana lainnya.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

hasilnya akan terlihat seperti

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

mengubah "du -s" menjadi "du -sh" akan menampilkan ukuran yang dapat dibaca manusia, tetapi kita tidak dapat mengurutkan dengan metode ini.

Ambal
sumber
0

Anda dapat menggunakan di bawah ini untuk membuat daftar file dengan ukuran du -h | sort-jam | lebih atau du -h --max-depth = 0 * | sort-jam | lebih

Ghassan Shawahneh
sumber
0

Saya cenderung menggunakan du dengan cara yang sederhana.

du -sh */ | sort -n

Ini memberi saya gambaran tentang direktori apa yang memakan ruang paling banyak. Saya kemudian dapat menjalankan pencarian yang lebih tepat nanti.

Kecepatan
sumber
Ini berfungsi, tetapi mengabaikan unit pada ukuran file saat menyortir.
Benjamin Engwall