Soru Boyu çıkışa göre nasıl sıralayabilirim


İnsan okunabilir du çıkışının bir listesini almam gerek.

Ancak, du "boyuta göre sıralama" seçeneği yoktur ve sort insan okunabilir bayrağı ile çalışmıyor.

Örneğin, koşarken:

du | sort -n -r 

Boyutlandırılan disk kullanımını boyutuna göre (azalan) çıkarır:

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

Ancak, insan tarafından okunabilir bayrağı ile çalıştırılması, düzgün sıralanmaz:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

Herkes sıralamak için bir yol biliyor mu du -h  boyutuna göre?


834
2018-02-25 13:42


Menşei


Heh ... Bu soruyu sormalısın, çünkü bu beni en az bir yıldan fazla rahatsız ediyor. Geçtiğimiz hafta kodu GNU coreutils'e indirdim (hangi tür bir parçasıydı) ve bir bakışı vardı, ama ellerimin yamada yapmasından biraz daha fazla zaman alacağına karar verdim ... Herkes? :) - unwind
İşte çok ilgili bir soru: serverfault.com/q/737537/35034 - cregox
bunu gördün mü? unix.stackexchange.com/questions/4681/...  Yakın bir kopyası ve altın değer. Normal yaparsın du ama -h'yi sort Komut. Ekleyebilirsin -rh bu yüzden dosyadaki en büyük ilk, aksi takdirde ihtiyacınız var tail uzay domuzlarını görmek için. - SDsolar
Böyle bir soru sorduğumda bu kadar popüler olmayı beklemiyordum. - Mateen Ulhaq


Cevaplar:


İtibariyle GNU coreutils 7.5 Ağustos 2009'da yayınlandı sort izin verir -h tarafından üretilen türün sayısal soneklerine izin veren parametre du -h:

du -hs * | sort -h

Desteklemeyen bir sıralama kullanıyorsanız -hGNU Coreutils'i yükleyebilirsiniz. Örneğin. eski bir Mac OS X'te:

brew install coreutils
du -hs * | gsort -h

itibaren sort Manuel:

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)


1158
2017-07-01 12:29



Kılavuzun ilgili bölümü: gnu.org/software/coreutils/manual/... - wodow
Homebrew ile demlemek OS X kolay kurulum - demlemek coreutils. - Richard Poirier
İyi bir! Ben şahsen her zaman yaptım du -BM | sort -nr Bir geçici çözüm olarak - insan yeterince okunabilir ve eğer birisi eski coreutils ile sıkışmışsa, sıralanır. - chutz
Homebrew ile OSX kullanıyorsanız, şimdi sıralamak yerine gsort kullanmanız gerektiğini unutmayın: du -hs * | gsort -h - Brian Cline
@PaulDraper, du -BM her şeyi megabayt olarak basar, bu yüzden 168K olan bir dosya aslında 0M olarak görüntülenir. Başka bir versiyon uyuşmazlığı olmadığı sürece farkında değilim. Benim sürümü du sadece tamsayı megabayt değerlerini gösterir. - chutz


du | sort -nr | cut -f2- | xargs du -hs

82
2018-02-25 13:52



Ve büyük miktarda yinelenen sayım yapar. - Douglas Leeder
İlk önce normal du - o zaman her giriş için sadece okunabilir formda yazdırmak için boyutu yeniden hesaplar. - Douglas Leeder
@Douglas Leeder: Yinelenen sayım için haklısınız, fakat ikinci duyunun soğuk önbellek (OS) sayesinde başlayamadığını düşünün. @Hasen j: xargs çok kullanışlı bir komuttur, stdin'i böler ve argüman olarak besler. verilen komuta - cadrian
Chris, aslında, boşluk içeren yollar ile çalıştığı için daha üstündür. Bir oyu senin yoluna at, dostum. - rbright
Çirkin, ama çapraz platform :). - voretaq7


@Douglas Leeder, bir cevap daha: Başka bir araç kullanarak insan tarafından okunabilir çıkışı du -h'dan ayırın. Perl gibi!

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)}<>;'

Ekrana sığması için iki satıra bölün. Bunu bu şekilde kullanabilir veya tek katlı yapabilir, her iki şekilde çalışır.

Çıktı:

4.5M    .
3.7M    ./colors
372K    ./plugin
128K    ./autoload
100K    ./doc
100K    ./syntax

DÜZENLE: Birkaç tur golf oynadıktan sonra PerlMonksSon sonuç aşağıdaki gibidir:

perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'

59
2018-02-25 21:04



Kısa sürüm çıktılarınız açık stderr yüzünden die çıktı almak için değiştirebilir misin stdout? - Dennis Williamson
Değiştir die bir print ve gidecek stdout. Sadece iki karakter daha var. - Adam Bellaire
ubuntu üzerinde çalışıyor! - marinara
etkileyici perl hackistry - nandoP
Sonuç ters sırada :( - RSFalcon7


Kullandığım son derece kullanışlı bir araç var ncdu Bu sinir bozucu yüksek disk kullanımlı klasörleri ve dosyaları bulmak ve bunları kaldırmak için tasarlanmıştır. Konsol tabanlı, hızlı ve hafif ve tüm ana dağıtımlarda paketler var.


50
2018-02-25 20:39



Çok güzel ... Sonuçlar standartlara ulaşabilir mi diye merak ediyorum ... Bu kadar tembelim ki el kitabını okuyamıyorum - ojblass
gt5 aynı damardadır; Katil özelliği büyüme gösteriyor. - Tobu
Bu gerçekten havalı! Ve etrafta takılmaktan çok daha hızlı duSadece büyük dizinleri tanımlamak istiyorsanız. - BurninLeo


du -k * | sort -nr | cut -f2 | xargs -d '\n' du -sh

43
2018-02-25 14:01



sadece aradığım şey teşekkürler - Edward Tanguay
İle kullanamaz du -k --totalsonunda hata veriyor du: cannot access 'total': No such file or directory - laggingreflex
Bunu başka bir cevabı daha çok beğeniyorum. Sadece ilk 50 sonuca nasıl ulaşırsın? - Mauro
@Mauro - sadece sonuca boru head ekleyerek `| sonunda kafa -50`. - Samuel Lelièvre


Görebildiğim kadarıyla üç seçeneğin var:

  1. değiştirmek du gösterilmeden önce sıralamak için.
  2. değiştirmek sort sayısal sıralama için insan boyutlarını desteklemek.
  3. Temel çıktıyı insan tarafından okunabilir hale getirmek için çıktıyı sıradan işlemden geçirin.

Sen de yapabilirsin du -k ve KiB cinsinden boyutları ile yaşamak.

3. seçenek için aşağıdaki komut dosyasını kullanabilirsiniz:

#!/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

20
2018-02-25 13:53





Bu sorunu da yaşadım ve şu anda bir geçici çözüm kullanıyorum:

du -scBM | sort -n

Bu ölçeklenmiş değerler üretmez, ancak her zaman megabayt cinsinden boyut üretir. Bu daha az mükemmel, ama benim için hiçbir şeyden daha iyi (ya da boyutu bayt cinsinden gösteriliyor).


19
2018-02-25 13:56



Temel olarak -m ile aynı olan th -BM anahtarını seviyorum, ancak boyutu ve M'yi postfixed boyutunda görüntüleme avantajı var, bu yüzden 10M'den daha net olan 10M elde edersiniz :) - Tom Feiner
Bu sayfada şimdiye kadar gördüğüm en basit çözüm, teşekkürler! - Jeff Olson


Bulunan bu gönderme Başka yerde. Bu nedenle, bu kabuk betiği aramadan istediğiniz şeyi yapacak du herşeye iki kere. Kullanır awk ham baytları insan tarafından okunabilir bir biçime dönüştürmek için. Tabii ki, formatlama biraz farklıdır (her şey bir ondalık basamak hassasiyetine yazdırılır).

#/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
}}}'

Bunu benimde çalıştırıyorum .vim dizin verimleri:

4.4M            .
3.6M            ./colors
372.0K          ./plugin
128.0K          ./autoload
100.0K          ./syntax
100.0K          ./doc

(Sanırım 3.6M renk şemaları aşırı değil.)


18
2018-02-25 14:09



Benim de bir Perl cevabım var ama bence insanlar benden nefret edebilir: du -B1 | sıralama -nr | perl -e '% h = (0 => b, 1 => K, 2 => M, 3 => G); (<>) {($ s, @ f) için = bölünmüş / \ s + /; $ e = 3; $ e-- (1024 ** $ e> $ s); $ v = ($ s / (1024 ** $ e)); printf "% -8s% s \ n", sprintf ($) v> = 100? "% d% s": "% .1f% s", $ s / (1024 ** $ e), $ h {$ e}), @ f;} ' - Adam Bellaire
Perl cevabı aslında formatlamasını daha da yakınlaştırıyor. Yuvarlama kapalı olsa da ... Her zaman yuvarlak () yerine ceil () verir gibi görünüyor - Adam Bellaire
Hey, neden orada bir karma kullandım? Bir dizi olmalıydı ... sabah-beyin homurdanma.... - Adam Bellaire
Başka bir cevap olarak daha iyi bir Perl çözümü eklendi. - Adam Bellaire
Her iki sürüm, dosya adları boşluk içerdiğinde başarısız olur - Vi.


Bu sürüm kullanır awk sıralama tuşları için ekstra sütunlar oluşturmak. Sadece çağırır du bir Zamanlar. Çıktı tam olarak görünmelidir du.

Onu birden çok satıra böldüm, ancak bir tek astarlı olarak yeniden birleştirilebilir.

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

Açıklama:

  • BEGIN - birimlere göre gruplamak için 1, 2, 3 yerine K, M, G yerine indekslemek için bir dizgi oluşturun, eğer birim yoksa (boyut 1K'dan azsa), o zaman hiçbir eşleşme olmaz ve sıfır verilir (mükemmel! )
  • yeni alanları yazdırın - birim, değer (alfa-sort çalışmasını düzgün bir şekilde sıfır-sabit, sabit uzunlukta yapmak) ve orijinal çizgi
  • boyut alanının son karakterini indeksleyin
  • boyutun sayısal kısmını dışarı çekin
  • sonuçları sıralayın, ekstra sütunları atın

Olmadan deneyin cut ne yaptığını görmek için komut.

AWK komut dosyasında sıralama yapan ve ihtiyaç duymayan bir sürüm var. 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]]}'

14
2017-09-04 17:06



teşekkür ederim! Bu, OS X 10.6'da perl / phython komut dosyalarını saymamak için çalışan ilk örnek. ve iyi bir açıklama için tekrar teşekkürler. Yeni bir şey öğrenmek her zaman güzel. awk emin güçlü bir araçtır. - Wolf
Bunun için çok teşekkürler. Duyu değiştirdim du -sh * özyinelemeli yoklama olmadan hemen dosyaları ve dizinleri göstermek için. - HankCa