Chcę wyświetlić całą zawartość katalogu, w tym zawartość podfolderów, ale posortowaną według rozmiaru pliku. Do tej pory udało mi się dotrzeć do listowania i sortowania, jednocześnie będąc rekurencyjnym ls -lhSR
( h
miło jest mieć, ale zdecydowanie nie jest to dla mnie niezbędne, o ile mogę uzyskać rozmiary plików). Prawdopodobnie przeoczam coś oczywistego lub pytam o niemożliwe, ale każda rada tutaj byłaby bardzo mile widziana.
9
Ponieważ nie określiłeś konkretnej powłoki, oto alternatywa użycia kwalifikatorów glob zsh z
do rekurencji. Następnie na przykład:
rekurencyjnie wyświetlaj zwykłe pliki:
rekurencyjnie listy zwykły plików o rdered przez się fałdowanie L ength (czyli rozmiar):
rekurencyjnie lista zwykłe pliki, O rdered przez de wielkości bigowania:
rekurencyjnie wyświetlaj zwykłe pliki uporządkowane według malejących rozmiarów i wybierz 3 najlepsze wyniki:
Jeśli chcesz również rozmiary plików, możesz użyć
źródło
Z
globstar
ustawionym opcją powłoki możesz używać globowania powłoki:Jeśli spróbujesz, używając zbyt wielu plików, pojawi się błąd „Zbyt długa lista argumentów”. Aby obejść ten problem, możesz użyć
printf
ixargs
:Właśnie zdałem sobie sprawę, że to drukuje katalogi (o rozmiarze 4096 bajtów) - jeśli tego nie chcesz, użyj tego zamiast:
Przykładowy przebieg
źródło
dotglob
opcję powłoki, zobacz moją zaktualizowaną odpowiedź.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
ls -lhSd **/*
jeśli nie masz nic przeciwko umieszczeniu katalogów na liście. Lub jeśli nie ma.
w nich żadnej z nazw katalogów , a wszystkie pliki, które chcesz zrobić , możeszll -hS **/*.*
lub podobnie.Jeśli nie masz Zsh, nadal możesz użyć
du
+sort
:Rozmiary czytelne dla człowieka, w tym skumulowane rozmiary katalogów:
Tylko pliki (za pomocą
find
):W obu przypadkach, że wybrali do korzystania NUL linii (
-0
,-z
,-print0
Opcje), aby być bezpieczne przed wszelkimi obowiązującymi nazwach plików.źródło
shopt -s globstar
Naprawdę fajne jest szybkie interaktywne korzystanie z drzew katalogów, które nie są zbyt duże . Glob nie może odfiltrować katalogów na podstawie typu, ale jeśli go użyjesz,ls -d
pols
prostu wydrukuje nazwę katalogu zamiast zawartości.Zakładając, że twój
ll
alias obejmuje-lh
:da ci taki wynik (z mojego katalogu code-golf), ale z podświetlaniem kolorów (więc łatwiej jest zobaczyć katalogi). Zauważ, że sortowanie według rozmiaru pliku miało miejsce w podkatalogach.
Możesz odfiltrować katalogi, przepuszczając przez
grep -v '^d'
Czasami możesz użyć globu, który pasuje tylko do plików, a nie do katalogów, jeśli twoje nazwy plików mają wzorzec. np.
ll -rSd **/*.jpg
lub nawet**/*.*
działa, jeśli nie ma.
w nich żadnej z nazw katalogów i wszystkich plików, które chcesz zrobić .(Dla osób z tłem DOS:
*.*
w Uniksie nie ma nic magicznego . Po prostu pasuje do każdej pozycji katalogu, która zawiera dosłowną kropkę. Ale oprócz plików wykonywalnych i czasami plików tekstowych, często podaje się rozszerzenia nazw plików.)@dessert wskazuje, że będziesz potrzebować
shopt -s dotglob
, aby dopasować wszystkie pliki.Z GNU
find
Jeśli nie ma zbyt wielu plików, aby zmieściły się w jednym
ls
wierszu poleceń,find -exec ls {} +
umieści je wszystkie w wierszu poleceń, gdziels
można je posortować.Używanie
-not -type d
zamiast-type f
unika ignorowania dowiązań symbolicznych, nazwanych potoków, gniazd, plików urządzeń i wszystkiego innego, co masz w swoich katalogach.Z
du
:Teraz nazwy katalogów są sortowane na liście w celu zsumowania całej ich zawartości, ale pojedyncze pliki są nadal uwzględniane.
sort -h
, aka--human-numeric-sort
, sortuje liczby z przyrostkami rozmiaru, takimi jakdu -h
odbitki. Jest idealny do użycia zdu
.Często używam
du -sch * | sort -h
lub,*/
aby uzyskać tylko katalogi.du -sch **/* | sort -h
dałoby ci powyższy wynik, jeśli zapomnisz, żedu
ma-a
opcję.(Poświęciłem trochę czasu, by to sprawdzić, ponieważ zamieszczam odpowiedź. Do użytku interaktywnego prawdopodobnie bym właśnie użył
du -sch **/*
.źródło