Wyświetlanie plików w katalogu wraz z zawartością podfolderów z sortowaniem

9

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( hmił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.

tomy
źródło

Odpowiedzi:

15

Możesz użyć find:

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

Opcjonalnie: Aby przekonwertować wartości bajtów na format czytelny dla człowieka, dodaj to:

| numfmt --to=iec-i --field=1

Wyjaśnienie:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)
pLumo
źródło
Och idealnie! Dziękuję bardzo, to zrobiło dokładnie to, czego potrzebowałem!
toms
3
Cieszę się, że moja odpowiedź pomogła ci. Rozważ kliknięcie znacznika wyboru po lewej stronie, aby zaznaczyć odpowiedź zaakceptowaną. Dzięki.
pLumo
1
@RoVo byłoby również miło głosować za pytaniem, ponieważ biorąc pod uwagę, że odpowiedziałeś na nie, prawdopodobnie uważasz, że jest interesujące i przydatne.
terdon
To prawda i zrobiłem to teraz ;-)
pLumo
@toms Można odczekać chwilę (może dzień), aby zaakceptować odpowiedź, nawet jeśli jest tak dobra jak ta. Gdy odpowiedź zostanie zaakceptowana, kolejna odpowiedź nie będzie jeszcze lepsza. Z tego powodu wiele osób nie zadaje sobie trudu, aby przesyłać inne odpowiedzi, więc nie mamy szansy zobaczyć ich, aby dowiedzieć się, czy jest lepiej.
Monty Harder
7

Ponieważ nie określiłeś konkretnej powłoki, oto alternatywa użycia kwalifikatorów glob zsh z

setopt extendedglob

do rekurencji. Następnie na przykład:

  1. rekurencyjnie wyświetlaj zwykłe pliki:

    printf '%s\n' **/*(.)
  2. rekurencyjnie listy zwykły plików o rdered przez się fałdowanie L ength (czyli rozmiar):

    printf '%s\n' **/*(.oL)
  3. rekurencyjnie lista zwykłe pliki, O rdered przez de wielkości bigowania:

    printf '%s\n' **/*(.OL)
  4. rekurencyjnie wyświetlaj zwykłe pliki uporządkowane według malejących rozmiarów i wybierz 3 najlepsze wyniki:

    printf '%s\n' **/*(.OL[1,3])

Jeśli chcesz również rozmiary plików, możesz użyć

du -hb **/*(.OL[1,3])
steeldriver
źródło
4

Z globstarustawionym opcją powłoki możesz używać globowania powłoki:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

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ć printfi xargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

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:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Przykładowy przebieg

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
deser
źródło
Niezłe rozwiązanie. W porównaniu do znalezienia, nie zawiera ukrytych plików, jak to osiągnąć?
pLumo,
@RoVo Zawsze o nich zapominaj - wystarczy ustawić dotglobopcję powłoki, zobacz moją zaktualizowaną odpowiedź.
deser
Zamiast rozbierać katalogi po fakcie za pomocą sed, można rozważyć coś takiegoprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver
Możesz użyć, 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żesz ll -hS **/*.*lub podobnie.
Peter Cordes
zamienił to w odpowiedź
Peter Cordes
3

Jeśli nie masz Zsh, nadal możesz użyć du+ sort:

  1. Rozmiary czytelne dla człowieka, w tym skumulowane rozmiary katalogów:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Tylko pliki (za pomocą find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

W obu przypadkach, że wybrali do korzystania NUL linii ( -0, -z, -print0Opcje), aby być bezpieczne przed wszelkimi obowiązującymi nazwach plików.

muru
źródło
0

shopt -s globstarNaprawdę 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 -dpo lsprostu wydrukuje nazwę katalogu zamiast zawartości.

Zakładając, że twój llalias obejmuje -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

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.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

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 **/*.jpglub 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 lswierszu poleceń, find -exec ls {} +umieści je wszystkie w wierszu poleceń, gdzie lsmożna je posortować.

find -not -type d -exec ls --color -lrSh {} +

Używanie -not -type dzamiast -type funika ignorowania dowiązań symbolicznych, nazwanych potoków, gniazd, plików urządzeń i wszystkiego innego, co masz w swoich katalogach.


Z du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

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 jak du -hodbitki. Jest idealny do użycia z du.

Często używam du -sch * | sort -hlub, */aby uzyskać tylko katalogi.

du -sch **/* | sort -hdałoby ci powyższy wynik, jeśli zapomnisz, że duma -aopcję.

(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 **/*.

Peter Cordes
źródło