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 -sh
dane 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.
brew install coreutils
(który poprzedza wszystkie polecenia coreutils literą „g”). Możesz wtedy zrobićgdu -hs * | gsort -h
.du -hs *
działa dobrze w systemie Mac OS X, alesort -h
wracasort: invalid option -- h
. Można również zainstalować pakiet coreutils za pośrednictwem MacPorts, jak opisano tutaj .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:
Ponownie, zaokrągla to rozmiary do najbliższego MB. Możesz go zmienić, konwertując na wybraną jednostkę.
źródło
du -sm * | sort -n
.-s
/-g
tworzydu
rozmiary wyjściowe w megabajtach / gigabajtach.int($1 / (1024 * 1024))
Ten obsługuje nazwy plików z białymi znakami lub apostrofami i działa w systemach, które nie obsługują
xargs -d
lubsort -h
:co powoduje:
źródło
Oto kolejny:
Być może będziesz musiał zrobić
pierwszy.
źródło
du -sk * | sort -n | awk „{print $ 2} '| podczas czytania f; do du -sh "$ f"; gotowy
źródło
To polecenie posortuje według rozmiaru w MB
źródło
-h
flagi do du.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ć.
$NF
jest używany, ponieważ wzorzec#GB
lub#MB
był ostatnią kolumną w danych wyjściowych: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ą
a
na 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
a
użyj,printf
aby 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
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ć :)
źródło