Wyświetl wszystkie unikalne rozszerzenia plików zawartych w katalogu


11

Chciałbym zobaczyć wszystkie unikalne rozszerzenia plików zawartych w określonym katalogu. Jakie jest polecenie, aby to zrobić w bash?

Można użyć, find . -type faby uzyskać wszystkie pliki w bieżącym katalogu, a następnie usunąć rozszerzenie i potokować je uniq. Jaki jest najłatwiejszy sposób na usunięcie rozszerzenia?

Odpowiedzi:


15

Spróbuj tego:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Nie wyświetla niczego dla:

  • Pliki bez rozszerzenia
  • Pliki o nazwach zakończonych kropką
  • Ukryte pliki

Przydatne może być także podłączenie do niego potoku sort | uniq -c.


Nie działa z domyślnym sedem na moim Macu. Dostajęsed: illegal option -- r
dzhelil

8
@celil: Użyj -Ezamiast -rw OS X.
Wstrzymano do odwołania.

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Działa w systemie OS X, z wyjątkiem plików bez rozszerzenia. Mój folder pobierania:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Możesz sed -rzamiast tego potrzebować ?


Drobny problem: pliki bez rozszerzeń drukują swoją nazwę. Pliki ukryte (takie jak .DS_Store) drukują swoje nazwy bez prowadzenia ..


Poleciłbym sort -uzamiast sort | uniq. Mniejsze rozwidlanie i zużycie zasobów.
John T

Dzięki @John. Próbowałem trzymać się „ram” Celila, więc o tym nie pomyślałem.
Daniel Beck

Nie ma potrzeby ucieczki przed kropką w środku [].
Wstrzymano do odwołania.

3

Oto jeszcze jedno rozwiązanie, które nie myli się z nazwami plików zawierającymi osadzone znaki nowej linii i używa sort -uzdo prawidłowego sortowania rozszerzeń plików, które również mogą mieć osadzone znaki nowej linii:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

Szybkim i łatwym do zapamiętania sposobem na usunięcie rozszerzenia jest założenie, że wszystkie nazwy plików mają format „name.ext”, a następnie użyj:

 ls -1 | cut -d"." -f2- | sort | uniq -c

daje to liczbę unikalnych rozszerzeń, na przykład:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

widzę, dlatego lubię awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.