Zasadniczo szukam plików, a następnie sortuję według rozmiaru. Skrypt działa, jeśli nie posortuję rozmiaru według czytelnego dla człowieka. Ale chcę, żeby rozmiar był czytelny dla człowieka. Jak mogę sortować rozmiary, które są czytelne dla człowieka?
Na przykład:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Działa to zgodnie z oczekiwaniami, rozmiar moich plików w bajtach rosnąco:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Teraz chcę, aby rozmiar był czytelny dla człowieka, dlatego dodałem parametr -h do ls, a teraz niektóre pliki są nieczynne:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- Jak to działa?ls
wynikudu
zamiastls
może być dobrym pomysłem.find
's-printf
z jego%p
i%s
formaterami (po których następuje „humanizacja” rozmiarów).Odpowiedzi:
Próbować
sort -h k2
Jest to część gnu sort, BSD sort i innych.
źródło
ls
należy unikać analizowania wyników ?ls
i zamiast tego użyć bezpośrednio globowania plików. Sam globbing tu nie zadziała. To powiedziawszy, prawdopodobnie wolałbymdu
to.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(Mogę mieć nieprawidłowy przełącznik testu dowiązania symbolicznego). Jeśli nie obchodzą Cię dowiązania symboliczne,files=(*); echo ${#files[@]}
które stają się przenośne, jeśli używasz,set
a nie tablic.ls
ma wbudowaną tę funkcję, użyj-S
opcji i sortuj w odwrotnej kolejności:ls -lShr
źródło
-h
nie jest standardowąls
opcją , ale musi być użyteczna, jeśli OP już ją ma. Reszta jest standardowa i to z pewnością odpowiedź, którą bym napisał.ls
.-S
może nie być dostępna dla ciebiels
. FWIW,-S
jest obsługiwany nawet z biblioteką Emacsals-lisp.el
, która jest używana, gdy system operacyjny nie mals
. Działa na przykład w Emacsie w MS Windows.-h
może nie być powszechnie dostępny, ale i tak już go używa.-S
naprawdę powinien być powszechnie dostępny, ponieważ znajduje się w łączu POSIX, który zapewnia Toby. Istnieje jednak sporo zestawów narzędzi innych niż POSIX.Ponieważ nie wymieniono żadnej konkretnej powłoki, oto jak to zrobić w
zsh
powłoce:**
Wzór pasuje jak glob*
, ale po drugiej stronie/
w ścieżek, czyli jak rekurencyjny wyszukiwania zrobi.ls
Komenda pozwoliłoby ludzkich rozmiarów nieczytelne-h
, a format długa lista z-l
. Do-f
wyłącza opcję sortowania, więcls
będzie tylko listę plików w kolejności, w jakiej zostały podane.Ta kolejność jest uporządkowana według
**/*(.Lk-1024oL)
wzorca globowania nazw plików, dzięki czemu mniejsze pliki są wyświetlane jako pierwsze.**/*
Nieco pasuje każdy plik i katalog w katalogu i poniżej, ale(...)
modyfikuje zachowanie Glob za (jest to „glob kwalifikator”).Na
oL
końcu uporządkuje (o
) nazwy według rozmiaru pliku (L
„długość”)..
Na początku sprawia, że glob pasuje tylko zwykłe pliki (bez katalogów).Te
Lk-1024
pliki bitowe zaznaczane których rozmiar jest mniejszy niż 1024 KB ( „długość w KB mniej niż 1024”).Jeśli
zsh
nie jest to twoja podstawowa interaktywna powłoka, możesz użyćUżyj
setopt GLOB_DOTS
(lubzsh -o GLOB_DOTS -c ...
), aby dopasować również ukryte nazwy. ... lub po prostu dodajD
do ciągu kwalifikatora glob.Rozwijając powyższe, zakładając, że chcesz 2-kolumnowy wynik z nazwami ścieżek i czytelnymi dla ludzi rozmiarami, a także zakładając, że masz
numfmt
z GNU coreutils,lub szybciej
źródło
Jeśli
sort
nie masz takiej-h
opcji, możesz użyć (choć bardzo długiego) polecenia awk, takiego jak:To posortuje dane wyjściowe w bajtach, a następnie przekonwertuje je na ich czytelny dla człowieka rozmiar.
źródło
Czy to zadziała?
Pierwszy
awk
exp szuka plików mniejszych niż 1M, a drugi pobiera rozmiar bajtu z wyniku i konwertuje go do KB i drukuje pierwsze 3 elementy, aby uzyskać rozmiar czytelny dla człowieka.źródło