Pobierz wszystkie rozszerzenia i odpowiednią liczbę plików w katalogu

14

Pobieranie wszystkich rozszerzeń dla katalogu: łatwe. Sprawdzanie liczby plików dla konkretnego rozszerzenia: łatwe.

Ale nawiązywanie do wszystkich rozszerzeń plików i ich liczby jest aluzją.

na przykład.

+ dir
 + abc.txt
 + def.txt
 + abc.pdf
 * def.pov

powinien zwrócić coś takiego:

.txt 2
.pdf 1
.pov 1

Celem tego ćwiczenia jest ustalenie, które rozszerzenie pliku jest popularne w określonym katalogu.

Z góry dziękuję

denormalizer
źródło

Odpowiedzi:

47
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
      1 .6
      1 .cache
      1 .noconf
      1 .php
      1 .sl
      2 .bin
      2 .el
      2 .tdb
      4 .baseA
      4 .baseB
      4 .dat
      4 .DB
     27 .db
    221 .deb

Oto wyjaśnienie:

find ./ -type f

znajdź tylko plik, a nie katalog

grep -E ".*\.[a-zA-Z0-9]*$"

filtruj plik z rozszerzeniem

sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'

usuń ścieżkę i nazwę pliku, zapisz tylko rozszerzenie

sort | uniq -c | sort -n

sortuj, unikaj i sortuj

bindbn
źródło
Możesz sprawić, by regex pozwalał na więcej znaków w rozszerzeniu i wyeliminował grep, wykonując następujące czynności:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
Wstrzymano do odwołania.
Dennis, zamieniając grep i sed na sed, zwraca następujący błąd: sed: -e wyrażenie # 1, char 30: nieprawidłowe odwołanie \ 1 w RHS komendy `s '
denormalizer
2

Ponieważ używasz Linuksa (gnu grep), jest to dobry moment na użycie Perl REs (PCRE) -Pi -oopcji grep . Biorąc odpowiedź @ bindbn za świetnego kandydata:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
Jim
źródło