Listen Sie alle eindeutigen Erweiterungen für Dateien auf, die in einem Verzeichnis enthalten sind

10

Ich möchte alle eindeutigen Erweiterungen von Dateien sehen, die in einem bestimmten Verzeichnis enthalten sind. Was ist der Befehl, dies in Bash zu tun?

Man könnte verwenden find . -type f, um alle Dateien im aktuellen Verzeichnis abzurufen, dann die Erweiterung zu entfernen und an sie weiterzuleiten uniq. Was ist der einfachste Weg, um die Erweiterung zu entfernen?

dzhelil
quelle

Antworten:

14

Versuche dies:

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

Es gibt nichts aus für:

  • Dateien ohne Erweiterung
  • Dateien mit Namen, die mit einem Punkt enden
  • Versteckte Dateien

Es kann auch nützlich sein, es zu leiten sort | uniq -c.

Bis auf weiteres angehalten.
quelle
Funktioniert nicht mit dem Standard-Sed auf meinem Mac. Ich bekommesed: illegal option -- r
dzhelil
8
@celil: Verwenden Sie -Eanstelle von -rOS X.
Bis auf weiteres angehalten.
3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Funktioniert unter OS X, außer bei Dateien ohne Erweiterung. Mein Download-Ordner:

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

Vielleicht brauchen Sie sed -rstattdessen?


Kleines Problem: Dateien ohne Erweiterungen drucken ihren Namen. Versteckte Dateien (z. B. .DS_Store) drucken ihren Namen ohne Führung ..

Daniel Beck
quelle
Ich würde empfehlen , sort -ustatt sort | uniq. Weniger Gabeln und Ressourcenverbrauch.
John T
Danke @John. Ich habe versucht, mich innerhalb von Celils "Rahmen" zu halten, also habe ich nicht daran gedacht.
Daniel Beck
Es ist nicht notwendig, einem Punkt im Inneren zu entkommen [].
Bis auf weiteres angehalten.
3

Hier ist eine weitere Lösung, die nicht durch Dateinamen mit eingebetteten Zeilenumbrüchen verwechselt wird und sort -uzzum korrekten Sortieren von Dateierweiterungen verwendet wird, in die möglicherweise auch Zeilenumbrüche eingebettet sind:

# [^.]: 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
Werkzeug
quelle
3

Eine schnell und einfach zu merkende Möglichkeit, die Erweiterung zu entfernen, besteht darin, anzunehmen, dass alle Dateinamen das Format "name.ext" haben, und dann Folgendes zu verwenden:

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

Dies gibt an, wie viele eindeutige Erweiterungen es gibt, zum Beispiel:

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

siehe, deshalb mag ich awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Bankier
quelle