Bagaimana cara mendapatkan ukuran direktori dan subdirektori yang diringkas?

307

Katakanlah saya ingin mendapatkan ukuran setiap direktori sistem file Linux. Ketika saya menggunakan ls -lasaya tidak benar-benar mendapatkan ukuran folder yang diringkas.

Jika saya menggunakan dfsaya mendapatkan ukuran masing-masing sistem file yang dipasang tetapi itu juga tidak membantu saya. Dan dengan dusaya mendapatkan ukuran setiap subdirektori dan ringkasan dari keseluruhan sistem file.

Tetapi saya hanya ingin memiliki ukuran yang diringkas dari setiap direktori dalam folder ROOT dari sistem file. Apakah ada perintah untuk mencapainya?

2ndkauboy
sumber
The --totalbendera membantu bagi saya. Misalnya du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Jawaban:

433

Ini melakukan apa yang Anda cari:

du -sh /*

Apa artinya ini:

  • -s untuk memberikan total untuk setiap argumen baris perintah.
  • -huntuk sufiks yang dapat dibaca manusia seperti Muntuk megabita dan Guntuk gigabita (opsional).
  • /*cukup memperluas ke semua direktori (dan file) di /.

    Catatan: dotfiles tidak termasuk; lari shopt -s dotglobuntuk memasukkan itu juga.

Juga berguna adalah menyortir berdasarkan ukuran:

du -sh /* | sort -h

Sini:

  • -hmemastikan bahwa sortmenafsirkan sufiks yang dapat dibaca manusia dengan benar.
Thomas
sumber
8
Jika Anda memiliki dot-direktori di direktori root, Anda dapat menggunakannya shopt -s dotglobuntuk memasukkannya dalam hitungan.
Philipp
8
Ini sangat berguna, karena sederhana dan Anda dapat menempatkan jalur apa yang Anda inginkan daripada /*, misalnya ./untuk direktori saat ini atau ./*untuk setiap item dalam direktori saat ini.
psur
3
@psur atau Anda dapat menggunakan ./*/untuk mendapatkan hanya subfolder dan tidak semua item
relascope
7
Versi yang disortir:du -sh /* | sort -h
Vu Anh
2
@ c1phr Jika Anda sorttidak memilikinya -h, Anda harus mematikannya dujuga, jika tidak pengurutan akan mencampur kilo / mega / gigabytes. du -s /* | sort -nr.
Thomas
79

Saya sering perlu menemukan direktori terbesar, jadi untuk mendapatkan daftar yang diurutkan berisi 20 dir terbesar saya melakukan ini:

du -m /some/path | sort -nr | head -n 20

Dalam hal ini ukurannya akan dilaporkan dalam megabyte.

Janne Pikkarainen
sumber
11
Inilah cara untuk membuatnya lebih mudah dibaca du -sh / some / path | sort -hr | head -n 20
Xedecimal
6
@Xedecima masalah dengan menggunakan h adalah orang yang tidak tahu bagaimana menangani ukuran yang berbeda. Misalnya 268K diurutkan lebih tinggi dari 255M, dan keduanya diurutkan lebih tinggi dari 2.7G
chrisan
4
Argumen -h (dapat dibaca manusia) pada perintah 'sort' harus benar membaca nilai-nilai ini. Sama seperti bendera du -h mengekspornya. Tergantung pada apa yang Anda jalankan, saya kira.
Xedecimal
Bekerja di Ubuntu 16.04. Tip yang bagus.
SDsolar
sudo du -haxt 1G / | sort -hr | head -30
deviant
22

Saya suka menggunakan Ncdu untuk itu, Anda dapat menggunakan kursor untuk menavigasi dan menelusuri struktur direktori yang berfungsi dengan sangat baik.

BuddhaLincoln
sumber
Luar biasa. Kata kunci: du memenuhi ncurses. Anda dapat menggunakan buntuk menjatuhkan shell di direktori.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
11

Jawaban yang ada sangat membantu, mungkin beberapa pemula (seperti saya) akan menganggap ini bermanfaat juga.

  1. Loop yang sangat mendasar, tetapi bagi saya ini adalah awal yang baik untuk beberapa operasi terkait ukuran lainnya:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Sangat mirip dengan jawaban pertama dan hasil yang hampir sama dengan 1.), tetapi butuh beberapa waktu untuk memahami perbedaan * menjadi ./* jika dalam subdirektori:

    du -sh ./*
    
Martin
sumber
for eachtidak berfungsi karena menambahkan karakter konsol (misalnya \033[) ke daftar folder
machineaddict
@machineaddict tidak yakin apa yang Anda maksud. Saya menggunakan ini sepanjang waktu, bekerja untuk saya baik-baik saja.
Martin
coba jalankan perintah Anda mulai dengan for each. itu tidak akan berfungsi
machineaddict
saya menjalankan perintah persis seperti yang tertulis di sini. dimulai dengan untuk masing-masing. bekerja.
Martin
7

duDoa berikut harus bekerja pada sistem BSD:

du -d 1 /
Philipp
sumber
1
My du(Ubuntu 10.4) tidak memiliki -dopsi. Sistem apa yang Anda pakai?
Thomas
Di openSUSE saya, tidak ada opsi -d :(
2ndkauboy
OK, maka itu hanya opsi BSD (saya menggunakan OS X).
Philipp
Kombinasi opsi portabel yang tepat pada BSD / * NIX adalah du -sk /*. Aku sangat membenci -kbarang itu. Linux -hbenar - benar batu.
Dummy00001
dalam sistem lain, ini--max-depth
Wisnu Kumar
4

Ini tidak mudah. The duperintah baik menunjukkan file dan folder (default) atau hanya ukuran semua item yang Anda tentukan pada baris perintah (option -s).

Untuk mendapatkan item terbesar (file dan folder), diurutkan, dengan ukuran yang dapat dibaca manusia di Linux:

du -h | sort -h

Ini akan mengubur Anda dalam banyak file kecil. Anda dapat menghilangkannya dengan --threshold(1 MB dalam contoh saya):

du --threshold=1M -h | sort -h

Keuntungan dari perintah ini adalah bahwa ia termasuk folder titik tersembunyi (folder yang dimulai dengan .).

Jika Anda benar-benar hanya menginginkan folder, Anda harus menggunakan findtetapi ini bisa sangat, sangat lambat karena duharus memindai banyak folder beberapa kali:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Aaron Digulla
sumber
1
--threshold ^^^ opsi ini tidak tersedia di linux
podarok
1
@podarok Tersedia di OpenSUSE 13.2 Linux. Cobalah untuk menemukan versi distribusi Anda yang lebih baru atau kompilasi sendiri versi paket yang lebih baru.
Aaron Digulla
Itu tidak bekerja di Ubuntu LTS (14.04). Ini adalah yang terbaru))
podarok
@podarok Versi GNU coreutils manakah? Milik saya adalah 8,24.
Aaron Digulla
1
Caching mungkin istilah yang buruk. Saya memikirkan sesuatu seperti yang dilakukan di port superuser.com/a/597173/121352 ini di mana kami memindai konten disk sekali ke pemetaan dan kemudian terus menggunakan data dari pemetaan itu daripada memukul disk lagi.
Hennes
1

Perlu diketahui, bahwa Anda tidak dapat membandingkan direktori dengan dupada sistem / mesin yang berbeda tanpa memastikan, keduanya berbagi ukuran blok yang sama dari sistem file. Ini mungkin diperhitungkan jika Anda rsync beberapa file dari mesin linux ke nas dan Anda ingin membandingkan direktori yang disinkronkan pada Anda sendiri. Anda mungkin mendapatkan hasil yang berbeda dengan dukarena ukuran blok yang berbeda ....

Jimmy Koerting
sumber
0

Anda mungkin juga ingin memeriksa xdiskusage . Akan memberi Anda informasi yang sama, tetapi ditampilkan secara grafis, plus memungkinkan untuk menelusuri (sangat berguna). Ada utilitas serupa lainnya untuk KDE dan bahkan Windows.

sleske
sumber
0

Anda bisa menggunakannya lsbersamaan dengan awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

Output dari lsdisalurkan ke awk. awkmulai memproses data. Pembatas standar adalah ruang. Variabel penjumlahan totdiinisialisasi ke nol; pernyataan berikut dijalankan untuk setiap baris / baris yang dikeluarkan oleh ls. Itu hanya bertambah totdengan ukuran. $5singkatan kolom kelima (dihasilkan oleh ls). Pada akhirnya kami membagi dengan (1024 * 1024) untuk menjumlahkan dalam megabyte.

Jika Anda akan mengonversinya menjadi skrip atau fungsi (.bashrc), Anda juga dapat menggunakannya untuk mendapatkan ukuran subset direktori tertentu, sesuai dengan tipe file.

Jika Anda menginginkan informasi sistem yang luas, kdirstatsemoga bermanfaat!

JM Stoorvogel
sumber
Saya setuju orang dapat memperluas contoh ini dan melakukan trik seperti mendapatkan ukuran "subset direktori tertentu, sesuai dengan tipe file" dll .; ini mungkin terlihat sebagai titik awal yang baik. Namun demikian solusi ini cacat sejak awal. Untuk setiap pengguna yang ingin menggunakan metode ini, saya sarankan membaca jawaban dan komentar untuk pertanyaan ini serta artikel yang ditautkan di sana . Saya tidak mengatakan Anda tidak bisa melakukannya sama sekali. Ketahui keterbatasannya, itu saja.
Kamil Maciorowski