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.

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.


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ę.


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

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.


1

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


1

To polecenie posortuje według rozmiaru w MB

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

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ć :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.