Saya perlu untuk mendapatkan daftar yang dapat dibaca manusia du output.
Namun, du
tidak memiliki "urutkan berdasarkan ukuran" pilihan, dan pipa untuk semacam
doesn't bekerja dengan manusia yang dapat dibaca bendera.
Misalnya, menjalankan:
du | sort -n -r
Output yang diurutkan penggunaan disk dengan ukuran (menurun):
du |sort -n -r
65108 .
61508 ./dir3
2056 ./dir4
1032 ./dir1
508 ./dir2
Namun, menjalankan dengan yang dapat dibaca manusia bendera, tidak memilah dengan benar:
du -h | sort -n -r
508K ./dir2
64M .
61M ./dir3
2.1M ./dir4
1.1M ./dir1
Apakah ada yang tahu cara semacam du -h
dengan ukuran?
Sebagai GNU coreutils 7.5 dirilis pada bulan agustus 2009, semacam
memungkinkan -h
parameter, yang memungkinkan numerik akhiran dari jenis yang diproduksi oleh du -h
:
du -hs * | sort -h
Jika anda menggunakan jenis yang tidak mendukung -h
, anda dapat menginstal GNU Coreutils. E. g. orang yang lebih tua, Mac OS X:
brew install coreutils
du -hs * | gsort -h
Dari semacam
manual:
-h, --manusia-numerik-sort membandingkan dibaca manusia nomor (misalnya, 2K 1G)
@Douglas Leeder, satu lagi menjawab: Semacam manusia-dibaca output dari du -h menggunakan alat lain. Seperti Perl!
du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'
Dibagi ke dalam dua baris untuk menyesuaikan tampilan. Anda dapat menggunakan cara ini atau membuat sebuah one-liner, it'll bekerja dengan cara yang baik.
Output:
4.5M .
3.7M ./colors
372K ./plugin
128K ./autoload
100K ./doc
100K ./syntax
EDIT: Setelah beberapa putaran golf di PerlMonks, hasil akhir adalah sebagai berikut:
perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'
Ada aplikasi yang sangat berguna alat yang saya gunakan bernama ncdu yang dirancang untuk menemukan orang-orang sial yang tinggi disk-penggunaan folder dan file, dan menghapus mereka. It's console based, cepat dan ringan, dan memiliki paket-paket di semua distro.
Sejauh yang saya bisa melihat anda memiliki tiga pilihan:
du
untuk mengurutkan sebelum display.sort
untuk mendukung manusia untuk ukuran numerik semacam.Anda juga bisa melakukan du -k
dan hidup dengan ukuran-ukuran dalam KiB.
Untuk opsi 3, anda bisa menggunakan script berikut:
#!/usr/bin/env python
import sys
import re
sizeRe = re.compile(r"^(\d+)(.*)$")
for line in sys.stdin.readlines():
mo = sizeRe.match(line)
if mo:
size = int(mo.group(1))
if size < 1024:
size = str(size)+"K"
elif size < 1024 ** 2:
size = str(size/1024)+"M"
else:
size = str(size/(1024 ** 2))+"G"
print "%s%s"%(size,mo.group(2))
else:
print line
I've punya masalah juga dan I'm saat ini menggunakan solusi:
du -scBM | sort -n
Ini tidak akan menghasilkan skala nilai, tapi selalu menghasilkan ukuran megabyte. Yang's kurang sempurna, tapi bagi saya itu's lebih baik dari apa-apa (atau menampilkan ukuran dalam byte).
Ditemukan posting ini di tempat lain. Oleh karena itu, ini shell script akan melakukan apa yang anda inginkan tanpa menyebut du
pada segala sesuatu dua kali. Menggunakan awk
untuk mengkonversi mentah byte untuk format terbaca-manusia. Tentu saja, format yang sedikit berbeda (semuanya dicetak ke satu tempat desimal presisi).
#/bin/bash
du -B1 | sort -nr |awk '{sum=$1;
hum[1024**3]="G";hum[1024**2]="M";hum[1024]="K";
for (x=1024**3; x>=1024; x/=1024){
if (sum>=x) { printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
}}}'
Berjalan ini pada saya .vim
direktori hasil:
4.4M .
3.6M ./colors
372.0K ./plugin
128.0K ./autoload
100.0K ./syntax
100.0K ./doc
(Saya berharap 3,6 M dari skema warna isn't berlebihan.)
Versi ini menggunakan awk
untuk membuat kolom tambahan untuk jenis kunci. Itu hanya panggilan du
sekali. Output akan terlihat persis seperti du
.
I've membagi menjadi beberapa baris, tetapi dapat digabung menjadi satu-liner.
du -h |
awk '{printf "%s %08.2f\t%s\n",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0}' |
sort -r | cut -f2,3
Penjelasan:
Cobalah tanpa cut
perintah untuk melihat apa itu's lakukan.
Berikut ini's versi yang melakukan sorting dalam AWK script dan doesn't perlu cut
:
du -h |
awk '{idx = sprintf("%s %08.2f %s",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0);
lines[idx] = $0}
END {c = asorti(lines, sorted);
for (i = c; i >= 1; i--)
print lines[sorted[i]]}'
Berikut ini's contoh yang menunjukkan direktori yang lebih kompak bentuk diringkas. Menangani ruang di direktori/file.
% du -s * | sort -rn | cut -f2- | xargs -d "\n" du -sh
53G projects
21G Desktop
7.2G VirtualBox VMs
3.7G db
3.3G SparkleShare
2.2G Dropbox
272M apps
47M incoming
14M bin
5.7M rpmbuild
68K vimdir.tgz
Ada satu lagi:
$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'
I'm mulai seperti perl. Anda mungkin harus melakukan
$ cpan Number::Bytes::Human
pertama. Untuk semua perl hacker di luar sana: Ya, saya tahu bahwa jenis bagian ini juga dapat dilakukan dalam perl. Mungkin du bagian juga.
Ini cuplikan itu tak tahu malu tersangkut dari 'Jean-Pierre' dari http://www.unix.com/shell-programming-scripting/32555-du-h-sort.html. Apakah ada cara saya dapat kredit lebih baik dia?
du -k | sort -nr | awk '
BEGIN {
split("KB,MB,GB,TB", Units, ",");
}
{
u = 1;
while ($1 >= 1024) {
$1 = $1 / 1024;
u += 1
}
$1 = sprintf("%.1f %s", $1, Units[u]);
print $0;
}
'
Gunakan "-g" bendera
-g, --general-numeric-sort
compare according to general numerical value
Dan di /usr/local directory menghasilkan output seperti ini:
$ du |sort -g
0 ./lib/site_ruby/1.8/rubygems/digest
20 ./lib/site_ruby/1.8/rubygems/ext
20 ./share/xml
24 ./lib/perl
24 ./share/sgml
44 ./lib/site_ruby/1.8/rubygems/package
44 ./share/mime
52 ./share/icons/hicolor
56 ./share/icons
112 ./share/perl/5.10.0/YAML
132 ./lib/site_ruby/1.8/rubygems/commands
132 ./share/man/man3
136 ./share/man
156 ./share/perl/5.10.0
160 ./share/perl
488 ./share
560 ./lib/site_ruby/1.8/rubygems
604 ./lib/site_ruby/1.8
608 ./lib/site_ruby
Ditemukan satu ini pada garis... tampaknya bekerja OK
du -sh * | tee /tmp/duout.txt | grep G | sort -rn ; cat /tmp/duout.txt | grep M | sort -rn ; cat /tmp/duout.txt | grep K | sort -rn ; rm /tmp/duout.txt
Berikut adalah metode sederhana yang saya gunakan, sangat rendah penggunaan sumber daya dan mendapatkan apa yang anda butuhkan:
du --max-depth=1 | sort -n | awk 'BEGIN {OFMT = "%.0f"} {print $1/1024,"MB", $2}'
0 MB ./etc
1 MB ./mail
2 MB ./tmp
123 MB ./public_html
Saya belajar awk dari meramu contoh ini kemarin. Butuh beberapa waktu, tapi itu sangat menyenangkan, dan saya belajar bagaimana menggunakan awk.
Hal itu hanya berjalan du sekali, dan memiliki output yang mirip dengan du -h
du --max-depth=0 -k * | sort -nr | awk '{ if($1>=1024*1024) {size=$1/1024/1024; unit="G"} else if($1>=1024) {size=$1/1024; unit="M"} else {size=$1; unit="K"}; if(size<10) format="%.1f%s"; else format="%.0f%s"; res=sprintf(format,size,unit); printf "%-8s %s\n",res,$2 }'
Ini menunjukkan angka-angka di bawah 10 dengan satu desimal.