Jeśli chcesz sortować w odwrotnej kolejności, po prostu dodaj -rprzełącznik.
Aktualizacja:
Aby wykluczyć katalogi (i pod warunkiem, że żadna z nazw plików lub obiektów dowiązań symbolicznych nie zawiera znaków nowej linii):
ls -lS | grep -v '^d'
Aktualizacja 2:
Widzę teraz, jak nadal pokazuje linki symboliczne, którymi mogą być foldery. Łącza symboliczne zawsze zaczynają się na literę l, jak w łączu.
Zmień polecenie, aby filtrować według -. Powinno to pozostawiać zwykłe pliki:
ls -lS | grep '^-'
W moim systemie pokazuje to tylko zwykłe pliki.
aktualizacja 3:
Aby dodać rekurencję, pozostawiłbym sortowanie wierszy sortpoleceniu i powiedziałbym, aby użyło piątej kolumny do sortowania.
ls -lR | grep '^-' | sort -k 5 -rn
-rnoznacza Odwróć i numerycznie, aby uzyskać największe pliki na górze. Wadą tego polecenia jest to, że nie wyświetla ono pełnej ścieżki do plików.
Jeśli potrzebujesz pełnej ścieżki do plików, użyj czegoś takiego:
find . -type f -exec du -h {} + | sort -r -h
findPolecenie rekursywnie znaleźć wszystkie pliki we wszystkich katalogach podrzędnych .i rozmowy du -h(czyli użycie dysku -humanreadable ), a następnie ponownie uporządkować dane wyjściowe. Jeśli twój find/ sortnie obsługuje -h, zamień na du -ki sort -rn. Pamiętaj, że rozmiar i użycie dysku to nie to samo.
dupodaje użycie dysku inne niż rozmiar pliku. W przypadku (GNU) du -hsortowanie numeryczne nie działa ( -hdo sortowania potrzebna będzie opcja GNU). xargs oczekuje na wejściu listy słów, które mogą być cytowane, więc nie będzie działać, jeśli nazwy plików zawierają spacje lub znaki cytowane.
Stéphane Chazelas
1
Widzę, że -S ma kolejność malejącą, a co z kolejnością rosnącą?
demongolem
3
Następujące @ StéphaneChazelas, to działa na mnie find . -type f -print0 | xargs -0 du -h | sort -rh. Jeśli chcesz po prostu powiedzieć, największe 30 pliki: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
( -lsopcja nie jest standardowa, ale można ją znaleźć w wielu implementacjach find, nie tylko w GNU. W GNU find i innych wyświetla coś podobnego do ls -likilku wyjątków, na przykład pliki z listami ACL nie są oznaczone znakiem +)
Jeśli nazwy plików mogą zawierać znaki nowej linii, z GNU find i GNU sort:
Zakłada się, że kolumna „grupa” (od -ls) nie zawiera żadnych spacji (stąd parametr -k 7), ale niekoniecznie tak jest.
kolistivra
1
dlaczego nie po prostu zrobić znaleźć ... -print0 | sort -zk7rn0?
Andre de Miranda,
10
Z zsh i GNU ls:
ls -ldU -- **/*(.OL)
Gdzie (.OL)jest kwalifikator globalny , .aby wybrać tylko zwykłe pliki, OLaby odwrócić kolejność według długości (rozmiar pliku, o w kolejności rosnącej, Ow dół).
(zauważ, że starsze wersje zsh miały problemy z rozmiarami plików przekraczającymi 2 ^ 32).
Niektóre systemy operacyjne mają ograniczenie wielkości listy argumentów przekazywanej do polecenia. W takich przypadkach potrzebujesz:
autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU
Jeśli chcesz tylko listę plików, a nie szczegółowe dane wyjściowe, po prostu wykonaj:
print -rl -- **/*(.OL)
Jeśli chcesz dołączyć ukryte pliki (których nazwa zaczyna się od kropki, z wyjątkiem .i ..) i wyszukać również w ukrytych katalogach, dodaj Dkwalifikator globbing:
Dzięki za wyjaśnienie, Stephane .. Jednak z jakiegoś powodu .. polecenie nie działa na mojej stacji roboczej. Używam ls (GNU coreutils) 8.25i zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Czy to działa tylko w przypadku niektórych wersji lsi zsh?
alpha_989
@ alpha_989, w jaki sposób to nie działa dla Ciebie? Działa dla mnie z tymi samymi wersjami i nie ma w tym kodzie nic, co by nie działało w wersjach przynajmniej 15 lat temu.
Stéphane Chazelas
9
Lista plików według rozmiaru rosnąco będzie:
ls -lSr
Dostępne są następujące opcje:
l: długi, pokazuje szczegółowego użytkownika, grupę, inne atrybuty, datę itp.
S: lista zamówień według rozmiaru (domyślnie malejąca)
Czy mógłbyś wyjaśnić opcje poprawy jakości odpowiedzi?
Rui F Ribeiro
6
Powiedzenie, że „pliki mogą znajdować się w dowolnym miejscu w określonym folderze” oznacza, że chcesz rekurencyjnie schodzić ze wszystkich katalogów (folderów) w katalogu początkowym (folderze). Oto, co findnależy zrobić:
find . -type f -exec ls -lSd {} +
To „odnajduje” wszystkie pliki w bieżącym katalogu roboczym ( .). Dla każdego znalezionego pliku lsuruchamiany jest proces sortowania znalezionych obiektów w kolejności wielkości. +Terminator z -execprzyczyn wielu argumentów, które mają być przekazane w postaci listy do ls. O ile twój katalog (folder) nie zawiera bardzo dużej liczby plików, powinieneś mieć jedną listę (a tym samym jeden proces rozwidlony), prowadzący do pożądanego rezultatu.
+1 za użycie flagi -h dla wyników przyjaznych dla człowieka.
computingfreak
2
Jakiś czas temu coś napisałem. Możesz przekazać argument, aby określić liczbę plików do wyświetlenia lub po prostu wpisać big, w którym przypadku otrzymasz 10.
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
Jako odmianę oryginalnego pytania, jeśli chcesz zobaczyć łączny rozmiar plików w podkatalogach:
#!/bin/bash
find ${1:-.}-maxdepth 1-type d -exec du -sm {} \; | sort -nr
Wielkości będzie wyświetlana w megabajtach (The min du -sm). Inne wartości akceptowane przez dusą -kdla kilobajtów, -gdla gigabajtów. Używanie -hdo wyświetlania czytelnego dla człowieka nie jest możliwe, ponieważ spowoduje to przerwanie sortowania.
Oto wersja, która seddołącza Mmegabajt:
find ${1:-.}-maxdepth 1-type d -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'
Katalog do wyświetlenia jest ustawiony, za pomocą ${1:-.}którego użyje pierwszego argumentu wiersza poleceń, jeśli został podany, lub katalogu bieżącego, jeśli zostanie wywołany bez argumentów.
UWAGA: Może to zająć dużo czasu w przypadku dużej liczby plików. Ta opcja -type dwyświetla tylko podkatalogi i wyklucza pliki w bieżącym folderze; jeśli chcesz również zobaczyć pliki w bieżącym folderze, usuń go.
Uwaga: możesz użyć ncduzamiast tego, który jest dostępny w większości repozytoriów linuksowych (na ubuntu / debian apt install ncdu), a także na osx ( brew install ncdu).
man ls
:-S sort by file size
Odpowiedzi:
Po prostu użyj czegoś takiego:
Kapitału S .
Spowoduje to sortowanie plików według rozmiaru.
Zobacz także:
man ls
Jeśli chcesz sortować w odwrotnej kolejności, po prostu dodaj
-r
przełącznik.Aktualizacja:
Aby wykluczyć katalogi (i pod warunkiem, że żadna z nazw plików lub obiektów dowiązań symbolicznych nie zawiera znaków nowej linii):
Aktualizacja 2:
Widzę teraz, jak nadal pokazuje linki symboliczne, którymi mogą być foldery. Łącza symboliczne zawsze zaczynają się na literę l, jak w łączu.
Zmień polecenie, aby filtrować według
-
. Powinno to pozostawiać zwykłe pliki:W moim systemie pokazuje to tylko zwykłe pliki.
aktualizacja 3:
Aby dodać rekurencję, pozostawiłbym sortowanie wierszy
sort
poleceniu i powiedziałbym, aby użyło piątej kolumny do sortowania.-rn
oznacza Odwróć i numerycznie, aby uzyskać największe pliki na górze. Wadą tego polecenia jest to, że nie wyświetla ono pełnej ścieżki do plików.Jeśli potrzebujesz pełnej ścieżki do plików, użyj czegoś takiego:
find
Polecenie rekursywnie znaleźć wszystkie pliki we wszystkich katalogach podrzędnych.
i rozmowydu -h
(czyli użycie dysku -humanreadable ), a następnie ponownie uporządkować dane wyjściowe. Jeśli twójfind
/sort
nie obsługuje-h
, zamień nadu -k
isort -rn
. Pamiętaj, że rozmiar i użycie dysku to nie to samo.źródło
du
podaje użycie dysku inne niż rozmiar pliku. W przypadku (GNU)du -h
sortowanie numeryczne nie działa (-h
do sortowania potrzebna będzie opcja GNU). xargs oczekuje na wejściu listy słów, które mogą być cytowane, więc nie będzie działać, jeśli nazwy plików zawierają spacje lub znaki cytowane.find . -type f -print0 | xargs -0 du -h | sort -rh
. Jeśli chcesz po prostu powiedzieć, największe 30 pliki:find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30
.+ |
składnię+ | sort -r -h
?Możesz użyć czegoś takiego jak znajdź i sortuj.
(
-ls
opcja nie jest standardowa, ale można ją znaleźć w wielu implementacjach find, nie tylko w GNU. W GNU find i innych wyświetla coś podobnego dols -li
kilku wyjątków, na przykład pliki z listami ACL nie są oznaczone znakiem +)Jeśli nazwy plików mogą zawierać znaki nowej linii, z GNU find i GNU sort:
źródło
Z zsh i GNU ls:
Gdzie
(.OL)
jest kwalifikator globalny ,.
aby wybrać tylko zwykłe pliki,OL
aby odwrócić kolejność według długości (rozmiar pliku,o
w kolejności rosnącej,O
w dół).(zauważ, że starsze wersje zsh miały problemy z rozmiarami plików przekraczającymi 2 ^ 32).
Niektóre systemy operacyjne mają ograniczenie wielkości listy argumentów przekazywanej do polecenia. W takich przypadkach potrzebujesz:
Jeśli chcesz tylko listę plików, a nie szczegółowe dane wyjściowe, po prostu wykonaj:
Jeśli chcesz dołączyć ukryte pliki (których nazwa zaczyna się od kropki, z wyjątkiem
.
i..
) i wyszukać również w ukrytych katalogach, dodajD
kwalifikator globbing:źródło
.OL
zrobić? Czy to część polecenia?ls (GNU coreutils) 8.25
izsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Czy to działa tylko w przypadku niektórych wersjils
izsh
?Lista plików według rozmiaru rosnąco będzie:
Dostępne są następujące opcje:
źródło
Powiedzenie, że „pliki mogą znajdować się w dowolnym miejscu w określonym folderze” oznacza, że chcesz rekurencyjnie schodzić ze wszystkich katalogów (folderów) w katalogu początkowym (folderze). Oto, co
find
należy zrobić:To „odnajduje” wszystkie pliki w bieżącym katalogu roboczym (
.
). Dla każdego znalezionego plikuls
uruchamiany jest proces sortowania znalezionych obiektów w kolejności wielkości.+
Terminator z-exec
przyczyn wielu argumentów, które mają być przekazane w postaci listy dols
. O ile twój katalog (folder) nie zawiera bardzo dużej liczby plików, powinieneś mieć jedną listę (a tym samym jeden proces rozwidlony), prowadzący do pożądanego rezultatu.źródło
Wyświetlanie listy plików w odwrotnej kolejności:
ls -lSrh
W porządku rosnącym:
ls -lSh
źródło
Jakiś czas temu coś napisałem. Możesz przekazać argument, aby określić liczbę plików do wyświetlenia lub po prostu wpisać
big
, w którym przypadku otrzymasz 10.źródło
Wypróbuj te, działa dobrze dla mnie.
$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10
# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'
Nie jest to jednak idealna odpowiedź, ale do pewnego stopnia działa
źródło
sed
do cięcia produkcjiDodanie do odpowiedzi delha i komentarza Stéphane'a Chazelasa ...
find -print0
w połączeniu zxargs -0
dodaje obsługę spacji / spacji / whatnots.du -h | sort -rn
nie sortuje poprawnie między różnymi wielokrotnościami bajtów, np. 1,1M wyświetli się po 128 KB, co jest błędem.sort -rh
(--human-numeric-sort) zajmuje się tym, ale działa tylko w wersji GNU.Poniższe polecenia zapewnią pożądany wynik.
Czytelny dla człowieka, na GNU's sort / Linux:
find . -type f -print0 | xargs -0 du -h | sort -rh
W jednostkach kilobajtowych na BSD / OSX / innych:
find . -type f -print0 | xargs -0 du -k | sort -rn
W przypadku BSD / OSX zobacz także https://unix.stackexchange.com/a/188375/82895 .
źródło
Jako odmianę oryginalnego pytania, jeśli chcesz zobaczyć łączny rozmiar plików w podkatalogach:
Wielkości będzie wyświetlana w megabajtach (The
m
indu -sm
). Inne wartości akceptowane przezdu
są-k
dla kilobajtów,-g
dla gigabajtów. Używanie-h
do wyświetlania czytelnego dla człowieka nie jest możliwe, ponieważ spowoduje to przerwanie sortowania.Oto wersja, która
sed
dołączaM
megabajt:Katalog do wyświetlenia jest ustawiony, za pomocą
${1:-.}
którego użyje pierwszego argumentu wiersza poleceń, jeśli został podany, lub katalogu bieżącego, jeśli zostanie wywołany bez argumentów.UWAGA: Może to zająć dużo czasu w przypadku dużej liczby plików. Ta opcja
-type d
wyświetla tylko podkatalogi i wyklucza pliki w bieżącym folderze; jeśli chcesz również zobaczyć pliki w bieżącym folderze, usuń go.źródło