Sortowanie rozmiarów plików czytelnych dla ludzi

16

Jak mogę posortować listę za pomocą czytelnego dla człowieka sortowania według wielkości pliku, sortowania numerycznego uwzględniającego identyfikator wielkości (G, M, K)? Czy mogę np. Posortować du -shdane wyjściowe?

Problem: Rozważ problem z listowaniem plików / folderów i sortowaniem ich według rozmiaru. Możesz to osiągnąć, uruchamiając:

du -s * | sort -n

Wyświetla listę plików / folderów posortowanych według ich rozmiarów. Jednak drukowana wartość rozmiaru jest w bajtach (lub megabajtach lub gigabajtach, jeśli wybierzesz).

Byłoby pożądane, aby móc sortować w oparciu o wartości czytelne dla człowieka, więc mogę uruchomić coś analogicznego do

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

I folder 1,5 GB pokazuje się po 2,0M.

notnoop
źródło

Odpowiedzi:

29

Użyj GNU coreutils> = 7,5:

du -hs * | sortuj -h

(Zaczerpnięte z tego pytania o awarię serwera )

Strona podręcznika

Edycja: Możesz sprawdzić swoje wersje używając du --versioni sort --versionjeśli używasz wersji GNU. Jeśli używasz homebrew, być może będziesz musiał użyć gdui gsort.

Jason Axelson
źródło
8
OSX nie ma tej opcji. Możesz użyć homebrew do brew install coreutils(który poprzedza wszystkie polecenia coreutils literą „g”). Możesz wtedy zrobić gdu -hs * | gsort -h.
dsummersl,
1
Aby wyjaśnić punkt @ dsummersl: du -hs *działa dobrze w systemie Mac OS X, ale sort -hwraca sort: invalid option -- h. Można również zainstalować pakiet coreutils za pośrednictwem MacPorts, jak opisano tutaj .
jvriesem
3

Jeśli martwisz się o pliki większe niż 1 MB, jak się wydaje, możesz użyć tego polecenia, aby je posortować i użyć awk do konwersji rozmiaru na MB:

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

Ponownie, zaokrągla to rozmiary do najbliższego MB. Możesz go zmienić, konwertując na wybraną jednostkę.

Patrick
źródło
Jest to podobne do: du -sm * | sort -n. -s/ -gtworzy durozmiary wyjściowe w megabajtach / gigabajtach.
notnoop
W przypadku MB musisz podzielić jeszcze przez 1024. Tak będzieint($1 / (1024 * 1024))
Pratik Khadloya
2

Ten obsługuje nazwy plików z białymi znakami lub apostrofami i działa w systemach, które nie obsługują xargs -dlub sort -h:

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

co powoduje:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm
Mark Crossfield
źródło
1

Oto kolejny:

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

Być może będziesz musiał zrobić

$ cpan Number::Bytes::Human

pierwszy.

0x89
źródło
1

du -sk * | sort -n | awk „{print $ 2} '| podczas czytania f; do du -sh "$ f"; gotowy


źródło
1

To polecenie posortuje według rozmiaru w MB

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
źródło
To właśnie robi użytkownik, po prostu nie podał przykładu z MiB, ale o tym wspomniał. To, czego szuka, to być w stanie posortować, używając -hflagi do du.
Tonin
0

Skończyłem tutaj, ponieważ próbowałem posortować coś innego, co połączy MB i GB w tym samym wyjściu i nie mogłem tego kontrolować.

$NFjest używany, ponieważ wzorzec #GBlub #MBbył ostatnią kolumną w danych wyjściowych:

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

Objaśnienie polecenia awk:

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

jeśli ostatnia kolumna pasuje do wzorca wyrażenia regularnego, który zawiera cyfrę lub .jeden lub więcej razy, po których następujeGB

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

następnie ustaw zmienną ana część cyfrową każdego wiersza, która pasuje do tego samego wzorca wyrażenia regularnego w tej samej ostatniej kolumnie ( $NF)

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

po ustawieniu aużyj, printfaby sformatować wyjście jako${a*1024}MB

else {print $NF}

w przeciwnym razie po prostu wydrukuj ostatnią kolumnę

sort -n

użyj sortowania numerycznego na wyjściu


przykład

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

Jestem pewien, że istnieje sposób na ponowne użycie wzorca wyrażenia regularnego, więc wykonuję dopasowanie tylko raz i zastępuję go na miejscu, ale jeszcze nie wiem, jak to zrobić :)

Jens Bodal
źródło