Am nevoie pentru a obține o listă de lizibil du ieșire.
Cu toate acestea, du
nu are un "un fel de dimensiune" opțiune, și conducte la fel
nu't de lucru cu lizibil pavilion.
De exemplu, de funcționare:
du | sort -n -r
Emite un sortate utilizare disc de dimensiune (descrescătoare):
du |sort -n -r
65108 .
61508 ./dir3
2056 ./dir4
1032 ./dir1
508 ./dir2
Cu toate acestea, rulează-l cu lizibil pavilion, nu a sorta în mod corespunzător:
du -h | sort -n -r
508K ./dir2
64M .
61M ./dir3
2.1M ./dir4
1.1M ./dir1
Stie cineva o modalitate de a sorta du -h
de dimensiune?
Ca de GNU coreutils 7.5 a lansat în luna August 2009, sortare
permite o -h
parametru, care permite numerice sufixe de tipul celor produse de du -h
:
du -hs * | sort -h
Dacă utilizați un fel care nu suport -h
, puteți instala GNU Coreutils. E. g. pe un mai vechi de Mac OS X:
brew install coreutils
du -hs * | gsort -h
La fel
manual:
-h, --omului-numeric-un fel compara lizibil numere (de exemplu, 2K 1G)
@Douglas Leeder, încă un răspuns: Un fel de om poate fi citit de ieșire din du -h folosind un alt instrument. Ca 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)}<>;'
Împărțit pe două linii pentru a încăpea pe ecran. Puteți utiliza acest fel sau de a face un one-liner, l'll de lucru oricum.
Ieșire:
4.5M .
3.7M ./colors
372K ./plugin
128K ./autoload
100K ./doc
100K ./syntax
EDIT: După câteva runde de golf la PerlMonks, rezultatul final este următorul:
perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'
Acolo este un extrem de util instrument folosesc numit ncdu, care este proiectat pentru a găsi cele plictisitor mare disk-utilizare foldere și fișiere, și de a le scoate. L's console based, rapid și ușor, și a pachetelor de pe toate marile distributii.
În măsura în care pot vedea, aveți trei opțiuni:
du
la fel înainte de afișare.sort
în sprijinul omului dimensiuni pentru numerică fel.Ai putea face, de asemenea, du -k` și de a trăi cu dimensiuni în Kio.
Pentru opțiunea 3, ai putea folosi următorul script:
#!/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
Am'am avut problema asta la fel de bine și m-am'm în prezent, folosind o soluție:
du -scBM | sort -n
Acest lucru nu se va produce scalate valori, dar produce întotdeauna dimensiunea în megaocteți. Ca's mai puțin perfect, dar pentru mine a'e mai bine decât nimic (sau afișarea dimensiunea în bytes).
Găsit aceasta postare în altă parte. Prin urmare, acest script de shell va face ceea ce vrei fără să sune dutotul de două ori. Foloseste
awk` pentru a converti prime bytes pentru un om-un format lizibil. Desigur, formatarea este ușor diferită (totul este imprimat cu o zecimală precizie).
#/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
}}}'
Rularea acest lucru în mea .vim
director randamente:
4.4M .
3.6M ./colors
372.0K ./plugin
128.0K ./autoload
100.0K ./syntax
100.0K ./doc
(Sper 3,6 M de scheme de culori e't excesivă.)
Această versiune folosește awk
pentru a crea coloane suplimentare pentru un fel de chei. Se solicită doar du
o dată. Rezultatul ar trebui să arate exact ca du
.
Am'am împărțit-o în mai multe rânduri, dar poate fi recombinate într-o singură linie.
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
Explicație:
Încercați să-l fără " cut " de comandă pentru a vedea ce se's fac.
Aici's o versiune care face sortarea în AWK script și nu't nevoie "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]]}'
Aici's un exemplu care arată directoare într-un mod mai compact formă de rezumat. Se ocupă spații în directorul/nume de fișiere.
% 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
Încă unul:
$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'
Am'm de pornire pentru ca perl. S-ar putea avea de a face o
$ cpan Number::Bytes::Human
în primul rând. La toate perl hackeri acolo: Da, știu că genul parte poate fi, de asemenea, face în perl. Probabil du parte, de asemenea.
Acest fragment a fost rușine agățat de 'Jean-Pierre' de http://www.unix.com/shell-programming-scripting/32555-du-h-sort.html. Există o modalitate pot mai bine de credit de el?
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;
}
'
Utilizați " g" pavilion
-g, --general-numeric-sort
compare according to general numerical value
Și pe /usr/local director produce astfel de rezultate:
$ 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
Găsit pe acesta pe linia... pare sa functioneze 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
Aici este simplă metodă pe care o folosesc, foarte scăzut de utilizare a resurselor și devine ceea ce ai nevoie:
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
Am învățat awk de născocirea acest exemplu ieri. A durat ceva timp, dar a fost foarte distractiv, și am învățat cum să utilizați awk.
Se rulează doar du-o dată, și ea are o ieșire de mult similar cu 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 }'
Acesta arată numerele de mai jos 10 cu o zecimală.