Jak znaleźć największy plik w katalogu i jego podkatalogach?

102

Dopiero zaczynamy klasę UNIX i uczymy się różnych poleceń Bash. Nasze zadanie polega na wykonywaniu różnych poleceń w katalogu, w którym znajduje się również kilka folderów.

Wiem, jak wyświetlić i policzyć wszystkie zwykłe pliki z folderu głównego, używając:

find . -type l | wc -l

Ale chciałbym wiedzieć, dokąd się udać, aby znaleźć największy plik w całym katalogu. Widziałem kilka rzeczy dotyczących dupolecenia, ale nie nauczyliśmy się tego, więc w repertuarze rzeczy, których się nauczyliśmy, zakładam, że musimy jakoś połączyć je z ls -tpoleceniem.

I wybacz mi, jeśli mój „żargon” nie jest poprawny, wciąż się do tego przyzwyczajam!

Rekson
źródło
2
Jeśli znasz polecenie, ale nie jesteś pewien, jak go użyć, spróbuj wpisać, mana następnie polecenie, które Cię interesuje. W górę pojawi się przyjemny ręczny wpis dla tego polecenia (naciśnij, qaby wrócić do wiersza poleceń).
Wydmy
related: unix.stackexchange.com/questions/140367/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

126

Cytat z tego linku-

Jeśli chcesz znaleźć i wydrukować 10 największych nazw plików (nie katalogów) w określonym katalogu i jego podkatalogach

$ find . -printf '%s %p\n'|sort -nr|head

Aby ograniczyć wyszukiwanie do bieżącego katalogu, użyj opcji „-maxdepth 1” z funkcją find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Aby wydrukować 10 największych „plików i katalogów”:

$ du -a . | sort -nr | head

** Użyj „head -n X” zamiast jedynego „head” powyżej, aby wydrukować X górnych największych plików (we wszystkich powyższych przykładach)

tamsler
źródło
1
Dlaczego "du -a. | Sort -nr | head" zwraca liczbę KB dwukrotnie większą niż rzeczywisty rozmiar pliku?
xxjjnn
6
Ach, musisz dodać opcję 'k' lub pokazuje wielokrotności 512 bajtów zamiast 1024. du -ak
xxjjnn
2
w przypadku pierwszego, jak uzyskać rozmiar w formacie czytelnym dla człowieka?
Bluz
@Bluz bym spróbować wymienić '%s %p\n'się '%p\n'i dodanie |xargs ls -lhdo końca
Duncan X Simpson
6
Pierwsze rozwiązanie nie działa na OS X dla mnie, więc skończyło się na użyciu Szybki sposób odfiltrować katalogów z trzeciego rozwiązania: du -am . | sort -nr | grep '\..*\.' | head. mJest wyświetlanie rozmiaru pliku w megabajtach i używane grep, aby pokazać linii z co najmniej dwoma punktami, pierwszy jest w ./na drodze, a drugi to rozszerzenie pliku, np .mov.
psmith
63

Aby znaleźć 25 najpopularniejszych plików w bieżącym katalogu i jego podkatalogach:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Spowoduje to wyświetlenie 25 najpopularniejszych plików poprzez sortowanie na podstawie rozmiaru plików za pomocą polecenia potokowego „sort -nr -k5”.

To samo, ale z rozmiarami plików czytelnymi dla człowieka:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25

xpros
źródło
10
find . -type f | xargs ls -lS | head -n 1

wyjścia

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Jeśli chcesz tylko nazwę pliku:

find . -type f | xargs ls -1S | head -n 1

Pozwala to uniknąć używania awki umożliwia używanie dowolnych flag ls.

Caveat . Ponieważ xargspróbuje uniknąć tworzenia zbyt długich wierszy poleceń, może to się nie powieść, jeśli uruchomisz go w katalogu z dużą ilością plików, ponieważ lskończy się wykonywanie więcej niż raz. Nie jest to problem nie do przezwyciężenia (możesz zebrać dane head -n 1wyjściowe z każdego lswywołania i uruchomić ls -Sponownie, zapętlając, aż uzyskasz pojedynczy plik), ale nieco psuje to podejście.

nneonneo
źródło
1
przepraszam xargs, zaniedbałem cię +1
Steve
2
do obsługi nazw plików ze spacjami użyjfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo
Znajduje to największe pliki tylko w pierwszej xargswykonanej partii . Aby to naprawić dodać Sortowanie: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Pracował dla mnie na OSX.
psmith
10

Nie ma prostego polecenia, które pozwoliłoby znaleźć największe pliki / katalogi w systemie plików Linux / UNIX / BSD. Jednak połączenie następujących trzech poleceń (za pomocą potoków) pozwala łatwo znaleźć listę największych plików:

# du -a /var | sort -n -r | head -n 10

Jeśli chcesz uzyskać bardziej czytelne dane wyjściowe, spróbuj:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Gdzie,

  • Var to katalog, który chcesz przeszukać
  • opcja du polecenie -h: wyświetl rozmiary w formacie czytelnym dla człowieka (np. 1K, 234M, 2G).
  • du polecenie -s opcja: pokaż tylko sumę dla każdego argumentu (podsumowanie).
  • du polecenie -x opcja: pomiń katalogi w różnych systemach plików.
  • polecenie sortowania -r opcja: odwraca wynik porównań.
  • polecenie sortowania -h opcja: porównaj liczby czytelne dla człowieka. To jest tylko opcja specyficzna dla GNU sortowania.
  • head command -10 LUB -n 10 opcja: pokaż pierwsze 10 linii.
Kalpana
źródło
Drugie polecenie podoba mi się bardziej, ale na osx nie ma zainstalowanej opcji -h dla wersji sortowania. Powinien być dla mac: du -hsx * | sort -rn | głowa -10
Yann VR
1
Kocham to drugie polecenie! Najlepsze ze wszystkich, których próbowałem - zachowam to na później.
CodeMouse92
8

Wyświetla rekursywnie pliki, jeśli są to zwykłe pliki, sortuje według siódmego pola (czyli rozmiaru w moim findwyniku; sprawdź swoje) i pokazuje tylko pierwszy plik.

find . -type f -ls | sort +7 | head -1

Pierwsza opcja findto ścieżka początkowa dla wyszukiwania rekurencyjnego. Typ fwyszukiwania normalnych plików. Zwróć uwagę, że jeśli spróbujesz przeanalizować to jako nazwę pliku, możesz się nie powieść, jeśli nazwa pliku zawiera spacje, znaki nowej linii lub inne znaki specjalne. Opcje sortróżnią się również w zależności od systemu operacyjnego. Używam FreeBSD.

„Lepszym”, ale bardziej złożonym i cięższym rozwiązaniem byłoby findprzeszukanie katalogów, ale może użyć go statdo uzyskania szczegółowych informacji o pliku, a następnie użyć awkdo znalezienia największego rozmiaru. Zwróć uwagę, że wynik działania statzależy również od systemu operacyjnego.

ghoti
źródło
1
Co ma +7robić argument? Na moim komputerze sort po prostu narzeka, że ​​nie może znaleźć pliku o nazwie +7.
Wydmy
@Dunes - Jak powiedziałem, sprawdź stronę podręcznika sortsystemowego w swoim systemie. W tej chwili używam OS X 10.4, gdzie użycie wywodzi się z sortowania FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Zwróć uwagę na +POS [-POS2]. Działa to również w aktualnych wersjach FreeBSD.
ghoti
2
Wygląda na to, że masz dla mnie inny program sortowania. To jest strona podręcznika dla mojego programu sort - linux.die.net/man/1/sort Aby to zadziałało na moim komputerze, musiałbyś jawnie użyć -kargumentu np. sort -k 7. edycja: przez OSX 10.5 strona podręcznika sortowania wydaje się być zmieniona na wersję, którą mam.
Wydmy
1
@Dunes - to wszystko sortowanie GNU, ale różne wersje. [+POS1] [-POS2]Notacja jest tylko starszy. O ile wiem, ta notacja jest nadal obsługiwana przez współczesne GNU sort, chociaż teraz, kiedy patrzę, wydaje się, że została usunięta ze strony podręcznika sortowania po wersji 5.1. Możesz to zobaczyć na stronie podręcznika systemowego sortowania dla FreeBSD 4.11 . Wydaje mi się, że nie czytałem strony podręcznika sortowania od czasu wydania FreeBSD 5.0!
ghoti
Zauważ też, że +POS1liczy parametry sortowania od zera, a -k POS1liczy od jednego.
ghoti
6

Spowoduje to znalezienie największego pliku lub folderu w obecnym katalogu roboczym:

ls -S /path/to/folder | head -1

Aby znaleźć największy plik we wszystkich podkatalogach:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
Steve
źródło
Myślę, że domyślnym zachowaniem ls jest wyświetlanie plików w kolumnach (tj. Kilka wpisów w wierszu), więc pierwszy nie znajduje dokładnie tylko największego pliku. Jeśli chodzi o twoje drugie polecenie, znalazło tylko największy plik w podanym katalogu, a nie jego podkatalogi.
Wydmy
@Dunes: Masz rację, pierwsze polecenie mogło znaleźć katalogi, ale nie z powodu domyślnego zachowania ls. W moich testach -Sflaga wyświetli jeden plik w każdym wierszu. Poprawiłem drugie polecenie. Mam nadzieję, że teraz jest w pełni odporny. Dziękuję Ci.
Steve
4

W Solarisie używam:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

lub

find . -type f -ls | sort -nrk7 | head -1 #unformatted

ponieważ nic innego, co tu zamieszczono, nie działało. Spowoduje to znalezienie największego pliku w $PWDpodkatalogach i.

skórki
źródło
2

Wypróbuj następującą jedną linijkę (wyświetl 20 największych plików):

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

lub (rozmiary czytelne dla człowieka):

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

Działa dobrze pod Linux / BSD / OSX w porównaniu z innymi odpowiedziami, ponieważ -printfopcja find nie istnieje w OSX / BSD i statma różne parametry w zależności od systemu operacyjnego. Jednak drugie polecenie do pracy na OSX / BSD prawidłowo (jak sortnie ma -h), instalacja sortz coreutilslub usunąć -hz lsi używać sort -nrzamiast.

Więc te aliasy są przydatne w plikach rc :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
kenorb
źródło
Pokazuje tylko nazwę pliku bez ścieżki, więc tak naprawdę nie pomaga w znalezieniu największego pliku.
psmith
Jak dla mnie na górze mam naprawdę największe pliki, ale na końcu to nie daje mi poprawnych plików
Borislav Markov
2

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

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Spowoduje to wydrukowanie największej nazwy i rozmiaru pliku oraz ponad 500 MB. Możesz przenieść if($1 > 500000)plik, a wydrukuje największy plik w katalogu.

zjhui
źródło
1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

lub

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'

Ansgar Wiechers
źródło
0

Ten skrypt upraszcza znajdowanie największych plików do dalszych działań. Trzymam go w katalogu ~ / bin i umieszczam ~ / bin w mojej $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size
jlettvin
źródło
0

To dość prostszy sposób:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Otrzymasz to: 8445 examples.desktop

Andrii Kovalchuk
źródło
Co 1***na koniec? Otrzymuję błąd „nie znaleziono dopasowań” dla tego argumentu.
user4815162342
0

Rozwiązanie dla systemu Linux: Na przykład chcesz zobaczyć wszystkie pliki / listę folderów w katalogu domowym (/) według rozmiaru pliku / folderu ( kolejność malejąca ).

sudo du -xm / | sort -rn | więcej

Monir
źródło
0

Aby wyświetlić większy plik w folderze

ls -sh /pathFolder | sort -rh | head -n 1

Rezultatem ls -shjest rozmiar si hzrozumiały dla człowieka widok numeru rozmiaru pliku.

Możesz użyć ls -shS /pathFolder | head -n 1. Większy Sz lsjuż uporządkuje listę z większych plików do mniejszych, ale pierwszym wynikiem jest suma wszystkich plików w tym folderze. Więc jeśli chcesz tylko wyświetlić większy plik, jeden plik, musisz head -n 2sprawdzić „wynik w drugiej linii” lub użyć pierwszego przykładu z ls sort head.

José Pacheco
źródło
0
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
Borislav Markov
źródło