Jak wyświetlić listę wszystkich plików uporządkowanych według rozmiaru


241

Chciałbym wymienić wszystkie pliki w kolejności od dużych do małych, a pliki mogą być obecne w dowolnym miejscu w określonym folderze.



5
od man ls:-S sort by file size
ctrl-alt-delor

Czy masz na myśli „pliki znajdują się w tym katalogu”, czy „pliki mogą znajdować się w dowolnym podkatalogu”.
ctrl-alt-delor

Jeśli możesz / chcesz użyć narzędzia GUI, spójrz na QDirStat , dawniej KDirStat .
RhinoDevel

Odpowiedzi:


290

Po prostu użyj czegoś takiego:

ls -lS /path/to/folder/

Kapitału S .

Spowoduje to sortowanie plików według rozmiaru.

Zobacz także:

man ls

-S     sort by file size

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.


5
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.
user7543

Cześć! Czy możesz wyjaśnić + |składnię + | sort -r -h?
Victor


25

Możesz użyć czegoś takiego jak znajdź i sortuj.

find . -type f -ls | sort -r -n -k7

( -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:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

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:

print -rl -- **/*(.DOL)

co robi .OLzrobić? Czy to część polecenia?
alpha_989

@ alpha_989, patrz edycja
Stéphane Chazelas,

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)
  • r: odwraca kolejność wyświetlania na liście

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
jest to miłe, ponieważ pozwala użyć modyfikatora -h na ls, aby wyświetlić ładne rozmiary plików
shmish111


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
}

2

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

$ ls -lS |grep  '^-' | head -n 6 

1
awk działa dobrze, jeśli nazwy plików nie zawierają spacji.
Eir Nym

tak .. użyć „sed” i zastąpić spację znakiem podkreślenia? jeśli to pomoże
Sand1512 12.04.16

Nie, używam seddo cięcia produkcji
Eir Nym

1

Dodanie do odpowiedzi delha i komentarza Stéphane'a Chazelasa ...

find -print0w połączeniu z xargs -0dodaje 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 .


1

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 du-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).

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.