Znajdź największe pliki lub katalogi

10

Które polecenie wydrukuje rozmiary wszystkich plików i katalogów w katalogu tmp (w tym ukrytych) i posortuje je według rozmiarów od największego do najmniejszego w formacie czytelnym dla człowieka (np. 2 GB)?

Dane wyjściowe mogą wyglądać następująco:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Próbowałem użyć poleceń lsi du, ale nie byłem w stanie znaleźć odpowiednich przełączników.

xralf
źródło

Odpowiedzi:

7

Oto szybka poprawka, użyj du + sort. Spróbuj tego:

du -smc * | sort -n

To zignoruje ukryte pliki, ale to kolejna łatwa poprawka:

du -smc .[^.] .??* * | sort -n

Może to powodować ostrzeżenia o tym, że jeden lub więcej powyższych wzorców nie pasuje do pliku. Pierwszy wzorzec .[^.]pasuje do wszystkich dwóch nazw plików rozpoczynających się od. z wyjątkiem ... drugiego wzorca .??*pasuje do wszystkich trzech liter lub więcej nazw plików rozpoczynających się od. i * pasuje do wszystkich plików, które nie zaczynają się od. Aby uzyskać bardziej wyrafinowane zestawienie, takie jak znajdowanie wszystkich plików większych niż X w całym systemie plików lub utrzymywanie listy wzrostu systemu plików, mam napisany skrypt powłoki DIY, który mogę udostępnić, jeśli jesteś zainteresowany.

penguin359
źródło
Dziękuję Ci. Interesuję się twoim skryptem, jeśli będziesz taki miły.
xralf
1
Użyj, sort -nrjeśli chcesz mieć najwyższe wartości na górze.
LawrenceC,
3

Aby wyświetlić listę plików w dowolnym miejscu /tmp, posortowane według rozmiaru:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Aby wyświetlić listę plików i drzew katalogowych bezpośrednio poniżej /tmp, posortowane według rozmiaru:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Aby wyświetlić listę wszystkich plików i drzew katalogowych w dowolnym miejscu poniżej /tmp, posortowane według rozmiaru:

du -ak /tmp | sort -k1n -k2

(Przykład ilustrujący różnicę między trzema poleceniami: jeśli istnieje plik /tmp/dir/file, lista pierwszych poleceń /tmp/dir/file, druga lista /tmp/diri trzecia lista oba).

Wszystkie powyższe polecenia pokazują rozmiary w kilobajtach. Podczas gdy GNU du może generować rozmiary „czytelne dla człowieka” (z mnożnikami k, M, G itp.), Sortowanie ich to inna sprawa. Wystarczającej ilości aktualnych coreutils GNU (≥7.4) może to zrobić: wystarczy wymienić du -kz du -hi sort -k1n -k2z sort -k1h -k2. W przeciwnym razie oto prosty skrypt awk do konwersji na przyrostki (zaokrąglanie w dół); po prostu potokuj sortwyjście powyżej.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
Gilles „SO- przestań być zły”
źródło
Dziękuję Ci. Te polecenia są przydatne, ale interesują mnie tylko pliki i katalogi bezpośrednio w tmp, a nie pliki w podkatalogach
xralf
1
@ xralf: Następnie użyj tylko drugiej formy dupołączenia.
Gilles 'SO - przestań być zły'
Wygląda dobrze, ale lepszy wynik uzyskano z MB i GB, jak opublikowano forcefsck.
xralf
3

Używam do tego następującego aliasu: alias ds='du -x --all --max-depth=1 . | sort -n'

Drukuje rozmiary wszystkich plików i podkatalogów 1. poziomu bieżącego katalogu.

RVS
źródło
To miłe, krótkie rozwiązanie, ale drukuje tylko katalogi.
xralf
Przepraszam, masz rację. Nigdy nie spotkałem się z tym problemem z plikami. Jednak dowiedziałem się, jak to zrobić z plikami: używanie --all swicth.
rvs
Świetne prawidłowe rozwiązanie. penguin359 ma nieco lepsze, ponieważ pokazuje rozmiary w MB. Najlepsze byłoby rozwiązanie forcefsck, ale jego rozwiązanie pomija katalogi ze spacjami.
xralf
1

Z bieżącą wersją gnu sort (i pożyczeniem wzorca pliku @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Ze starszą wersją

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDYCJA: dodano parametr -S , duaby nie uwzględniać podkatalogów.

forcefsck
źródło
Chciałem raczej miejsca na dysku używanego przez pliki i katalogi (całkowity rozmiar danych w środku) bezpośrednio w tmp (nie w podkatalogach). Moje polecenie sortowania nie ma opcji -h.
xralf
Nie jestem w 100% pewien, co masz na myśli, ponieważ zaakceptowałeś już odpowiedź z tym samym wyborem wzoru pliku. Edytowałem mój post, aby nie zawierał podkatalogów. Jeśli chcesz pozorny rozmiar, a nie rzeczywiste miejsce na dysku, możesz dodać --apparent-sizedo parametrów du.
forcefsck,
Teraz działa dobrze. Muszę tylko szukać GB, a potem MB, ale to nie problem.
xralf
Miałem litery jednostek w niewłaściwej kolejności, teraz naprawione. Jeśli chcesz, aby kolejność była duża lub mała, zmień kolejność liter jednostek i dodaj -r, aby posortować.
forcefsck,
Zauważyłem, że zapomniałem wydrukować rozmiar katalogu (bez prefiksu)
xralf
0

AKTUALIZACJA: Zeskrobałem poprzedni skrypt. Oto nowa wersja, wykorzystująca dui awk (poprzednia używana treei sed)

To jest wynik: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Oto skrypt

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
Peter.O
źródło
Mówiąc o rozmiarach wszystkich plików i katalogów , masz na myśli miejsce, które każdy element zajmuje na dysku (np. W moim systemie plików Ubuntu ext4 , pusty katalog zajmuje 4k miejsca na dysku, a plik mniejszy niż 4k zajmuje 4k Minimalna porcja przydziału to 4k) .. czy masz na myśli ilość danych w każdym pliku, np. 100 (bajty) .. A dla katalogów, czy chcesz znać całkowitą ilość danych pliku w tym katalogu .. Jeśli chcesz rozmiar danych w plikach, a następnie to treerobi. jeśli chcesz użyć miejsca na dysku, to durobi to ... ( treenie
sumuje
„du” jest lepszym wyborem ... Właśnie zauważyłem man du, że może również zgłaszać „pozorny rozmiar pliku” .... The apparent size of a file is the number of bytes reported by wc -c ”w zwykłych plikach, lub bardziej ogólnie, ls -l --block-size=1' or stat --format =% s ”. Na przykład plik zawierający słowozoo' with no newline would, of course, have an apparent size of 3.
Peter.O.
Chciałem raczej miejsca na dysku używanego przez pliki i katalogi (całkowity rozmiar danych w środku) bezpośrednio w tmp (nie w podkatalogach)
xralf
Przepraszam, nie jestem jeszcze na etapie pisania skryptów powłoki. Jeszcze go zrozumiałem, więc pozwoliłem innym użytkownikom zdecydować, jak dobra jest odpowiedź. Dziękujemy za Twoją pracę. Będę się tego uczył, kiedy będę lepszy.
xralf
0
find /tmp -exec du {} + | sort -nr | less 

pokazuje najpierw największe pliki, więc możesz korzystać z niego, qgdy tylko zobaczysz wystarczająco dużo.

nieznany użytkownik
źródło