Okunabilir dosya boyutlarını sıralama


16

Boyut tanımlayıcısını (G, M, K) hesaba katan, insan tarafından okunabilen dosya boyutu sıralaması, sayısal sıralama kullanarak bir listeyi nasıl sıralayabilirim? du -shÖrneğin " " çıktısını sıralayabilir miyim ?

Sorun: Dosyaları / klasörleri listeleme ve boyutlarına göre sıralama sorununu düşünün. Bunu çalıştırarak elde edebilirsiniz:

du -s * | sort -n

Bu, dosya / klasörleri boyutlarına göre sıralar. Ancak, yazdırılan boyut değeri bayt cinsindendir (veya megabayt veya isterseniz gigabayt).

İnsan tarafından okunabilir değerlere göre sıralama yapabilmek istenir, böylece benzer bir şey çalıştırabilirim

du -sh * | <human-readable file sort>

Ve 2.0GB'den sonra 1.5GB klasör görünür.

Yanıtlar:



29

GNU coreutils> = 7.5 kullanın:

du -hs * | sırala

(Bu sunucu hatası sorusundan alınmıştır )

Man sayfası

Düzenleme: GNU sürümlerini kullanarak du --versionve kullanıyorsanız sürümlerinizi kontrol edebilirsiniz sort --version. Homebrew kullanıyorsanız gduve kullanmanız gerekebilir gsort.


8
OSX'te bu seçenek yoktur. Homebrew brew install coreutilskomutunu ('core' komutunun başına bir 'g' ekler). Sonra yapabilirsin gdu -hs * | gsort -h.
dsummersl

1
@ Dsummersl'in amacını açıklığa kavuşturmak için: du -hs *Mac OS X'de iyi çalışıyor, ancak sort -hgeri dönüyor sort: invalid option -- h. Ayrıca coreutils paketini MacPorts üzerinden burada açıklandığı gibi kurabiliriz .
jvriesem

3

Eğer 1MB'den büyük dosyalar için endişeleniyorsanız, göründüğünüz gibi, bunları sıralamak için bu komutu kullanabilir ve boyutu MB'ye dönüştürmek için awk kullanabilirsiniz:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Yine, bu boyutları en yakın MB'ye yuvarlar. İstediğiniz birime dönüştürerek değiştirebilirsiniz.


Bu benzer: du -sm * | sort -n. -s/ -gYapar dumegabayt / gigabayt çıkış boyutları.
notnoop

MB için 1024'e bölmeniz gerekir. Öyleyse olacakint($1 / (1024 * 1024))
Pratik Khadloya

2

Desteklemeyen sistemlerde boşluk veya kesme işareti ve çalışmalarıyla Bu seferki kolları dosya adları xargs -dveya sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

sonuç:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

İşte burada bir başkası:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Yapmanız gerekebilir

$ cpan Number::Bytes::Human

ilk.


1

du -sk * | sıralama -n | awk '{2 $ yazdır}' | okunurken f; du -sh "$ f" yapın; tamam


1

Bu komut MB cinsinden boyuta göre sıralanır

du --block-size=MiB --max-depth=1 path | sort -n

Bu zaten kullanıcının yaptığı şey, sadece MiB ile örnek vermedi, ancak bundan bahsetti. Aradığı şey, -hbayrağı du için kullanırken sıralayabilmektir .
Mart'ta Tonin

0

MB ve GB'yi aynı çıktıda birleştiren başka bir şeyi sıralamaya çalıştığımdan beri buraya geldim ve kontrol edemedim.

$NF#GBveya #MBdeseni çıktıdaki son sütun olduğundan beri kullanılır :

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Awk komutunun açıklaması:

if ($NF ~ /[0-9\.]+GB/)

son sütun, bir rakam veya bir .veya daha fazla kez içeren normal ifade modeliyle eşleşiyorsaGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

daha sonra değişkeni a, her satırın aynı son sütunda ( $NF) aynı normal ifade modeliyle eşleşen basamak kısmına ayarlayın ( )

printf "%sMB\n", a*1024} \

ayarladıktan sonra , çıktıyı şu şekilde biçimlendirmek için akullanın:printf${a*1024}MB

else {print $NF}

aksi takdirde sadece son sütunu yazdır

sort -n

çıktıda sayısal sıralama kullan


misal

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Regex desenini yeniden kullanmanın bir yolu olduğundan eminim, bu yüzden sadece bir kez maç yapıyorum ve yerine koyuyorum, ama bunu nasıl yapacağımı henüz bilmiyorum :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.