Sortowanie plików według rozmiaru rekurencyjnie

78

Muszę znaleźć największe pliki w folderze.
Jak skanować folder rekurencyjnie i sortować zawartość według rozmiaru?

Próbowałem użyć ls -R -S, ale zawiera również katalogi.
Próbowałem też użyć find.

użytkownik2179293
źródło
1
Czy chcesz wylistować pliki w każdym podkatalogu osobno, czy też chcesz znaleźć wszystkie pliki we wszystkich podkatalogach i wymienić je według rozmiaru, niezależnie od tego, w którym podkatalogu się znajdują? Co rozumiesz przez „katalog” i „folder”? Wygląda na to, że używasz ich do opisywania różnych rzeczy.
terdon
Czy mówisz, że chcesz tylko wyświetlić listę plików w danym katalogu, a także plików w jego podkatalogach, nie pokazując tylko podkatalogów? Spróbuj wyczyścić swoje pytanie, nie jest to zbyt jasne.
slm
Powiązane unix.stackexchange.com/questions/158289/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

92

Możesz to również zrobić za pomocą just du. Dla pewności korzystam z tej wersji du:

$ du --version
du (GNU coreutils) 8.5

Podejście:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Podział podejścia

Polecenie du -ah DIRwyświetli listę wszystkich plików i katalogów w danym katalogu DIR. -hBędzie produkować ludzkie rozmiary czytelne które wolę. Jeśli nie chcesz ich, upuść ten przełącznik. Używam head -6tylko, aby ograniczyć ilość danych wyjściowych!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

Łatwo posortować od najmniejszej do największej:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Odwróć, od największego do najmniejszego:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

Nie pokazuj mi katalogu, tylko pliki:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Jeśli chcesz tylko listę od najmniejszych do największych, ale 6 najczęściej obrażających się plików, możesz odwrócić przełącznik sortowania, drop ( -r) i użyć tail -6zamiast head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books
slm
źródło
14
Ta grep -v "/$"część wydaje się nie działać zgodnie z oczekiwaniami, ponieważ do katalogów nie dołączono ukośnika. Czy ktoś wie, jak wykluczyć katalogi z wyników?
Jan Warchoł
@JanekWarchol - jakiej wersji coreutils używasz?
slm
Mam 8.13. Ale w każdym razie dane wyjściowe w Twojej odpowiedzi również nie mają końca /- na przykład /home/saml/Downloads/audiblewydaje się być katalogiem, ale nie ma ukośnika. Tylko /home/saml/Downloads/ma ukośnik, ale to prawdopodobnie dlatego, że napisał go z kreską przy określaniu argument początkowy du.
Jan Warchoł
1
Znajduje to także
katalog
1
To nie tylko listy plików, ale także katalogi :(
Roman Gaufman
20

Jeśli chcesz znaleźć wszystkie pliki w bieżącym katalogu i jego podkatalogach i wyświetlić je zgodnie z ich rozmiarem (bez uwzględnienia ich ścieżki) i zakładając, że żadna z nazw plików nie zawiera znaków nowej linii, w GNU findmożesz to zrobić:

find . -type f -printf "%s\t%p\n" | sort -n

Z man findsystemu GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

Od man sort:

   -n, --numeric-sort
          compare according to string numerical value
terdon
źródło
Niestety nie działa na komputerze Mac, pokazuje: znajdź: -printf: nieznany główny lub operator
Roman Gaufman
@RomanGaufman tak, dlatego odpowiedź określa wyszukiwanie GNU . Jeśli zainstalujesz narzędzia GNU na swoim Macu, będzie tam działać.
terdon
11

Spróbuj wykonać następujące polecenie:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Rekurencyjnie wyświetli listę 20 największych plików w bieżącym katalogu.

Uwaga: Opcja -hdla sortnie jest dostępna w OSX / BSD, więc musisz zainstalować sortz coreutils(np. Przez brew) i zastosować lokalną ścieżkę bin PATH, np.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Alternatywnie użyj:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

Do największych katalogów użyj dunp .:

du -ah . | sort -rh | head -20

lub:

du -a . | sort -rn | head -20
kenorb
źródło
3
Idealnie, to pierwsze rozwiązanie, które działa na Macu i nie pokazuje katalogów :) - dziękuję!
Roman Gaufman
jak filtr wyświetla tylko plik z liczbą wierszy> = X? (X = 0 dla przykładu)
Matryca
7

Spowoduje to znalezienie rekursywnie wszystkich plików i posortowanie ich według rozmiaru. Drukuje wszystkie rozmiary plików w KB i zaokrągla w dół, więc możesz zobaczyć 0 KB plików, ale było wystarczająco blisko dla moich zastosowań i działa na OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1

Brad Parks
źródło
działał również na Ubuntu 14.04!
David Lam
Zawiera listę katalogów, a nie tylko plików :(
Roman Gaufman
@RomanGaufman - dzięki za opinie! z moich testów, find . -type fznajduje pliki ... działa rekurencyjnie, masz rację, ale wyświetla wszystkie znalezione pliki, a nie same katalogi
Brad Parks
Xargs był używany w latach 80. To zły pomysł od 1989 roku, kiedy David Korn wprowadził execplus.
schily
5

Dzięki zshznajdziesz największy plik (pod względem pozornego rozmiaru, takiego jak kolumna rozmiaru na ls -lwyjściu, a nie użycie dysku) z:

ls -ld -- **/*(DOL[1])

Dla 6 największych:

ls -ld -- **/*(DOL[1,6])

Aby rozwiązać te o rozmiarze pliku, można użyć ls„s -Sopcję. Niektóre lsimplementacje mają również -Uopcję lsnie sortowania listy (ponieważ jest ona tutaj sortowana według rozmiaru zsh).

Stéphane Chazelas
źródło
3

Proste rozwiązanie dla systemu Mac / Linux, które pomija katalogi:

find . -type f -exec du -h {} \; | sort -h
mprcela
źródło
2

Odpowiednik w BSDlub OSXjest

$ du -ah simpl | sort -dr | head -6
Hanxue
źródło
0

Jest to niezwykle powszechna potrzeba z różnych powodów (lubię znaleźć najnowszą kopię zapasową w katalogu) i jest zaskakująco prostym zadaniem.

Zamierzam dostarczyć rozwiązanie dla Linuksa, które korzysta z narzędzi find, xargs, stat, tail, awk i sortowania.

Większość ludzi udzieliła kilku unikalnych odpowiedzi, ale ja wolę mój, ponieważ poprawnie obsługuje nazwy plików, a przypadek użycia można łatwo zmienić (modyfikować statystyki i sortować argumenty)

Zapewnię również rozwiązanie Python, które powinno umożliwiać korzystanie z tej funkcji nawet w systemie Windows

Rozwiązanie wiersza polecenia systemu Linux

Rekurencyjnie zwraca całą listę tylko plików z katalogu, posortowaną według rozmiaru pliku

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Tak jak poprzednio, ale tym razem zwróć największy plik.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Ten sam dokładny wzór, ale teraz wybierz najnowszy plik zamiast największego

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Wyjaśnienie:

  1. find: Rekurencyjnie wyszukuje wszystkie pliki z bieżącego katalogu i drukuje je ze znakiem null
  2. xargs: narzędzie do wykonywania poleceń za pomocą argumentów dostarczonych ze standardowego wejścia. Dla każdego wiersza danych wyjściowych chcemy uruchomić narzędzie stat dla tego pliku
  3. stat: Stat jest niesamowitym poleceniem, które ma tak wiele przypadków użycia. Drukuję dwie kolumny, pierwsza kolumna ma rozmiar bloku (% s), a druga kolumna jest nazwą pliku (% n)
  4. sortuj: Sortuj wyniki za pomocą przełącznika numerycznego. Ponieważ pierwszym argumentem jest liczba całkowita, nasze wyniki zostaną poprawnie posortowane
  5. tail: Wybierz tylko ostatni wiersz wyniku (ponieważ lista jest posortowana, jest to największy plik!)
  6. awk: Wybierz drugą kolumnę, która zawiera nazwę pliku i jest największym plikiem w katalogu rekurencyjnym.

Rozwiązanie Python

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Wyjaśnienie tego skryptu trwa nieco dłużej, ale w zasadzie jeśli zapiszesz go jako skrypt, przeszuka on pierwszy argument podany w wierszu poleceń i zwróci największy plik w tym katalogu. Skrypt nie sprawdza błędów, ale powinien dać ci wyobrażenie, jak podejść do tego w Pythonie, co daje niezłą platformę niezależną od rozwiązania tego problemu.

Luke Pafford
źródło
0

Wariant tej odpowiedzi na podobne pytanie

find . -type f -exec du -ah {} + | sort -rh | more
crizCraig
źródło
0

Wypróbuj poniższe polecenie z opcją sortowania, aby mieć foldery o rozmiarze w porządku rosnącym

du -sh * | sort -sh

Dhaval H. Nena
źródło
-1

Coś, co działa na dowolnej platformie oprócz AIX i HP-UX, to:

find . -ls | sort +6 | tail
schily
źródło