Antworten:
Versuchen Sie dies (nicht sicher, ob es der beste Weg ist, aber es funktioniert):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Es funktioniert wie folgt:
git ls-tree -r HEAD --name-only
anstelle vonfind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Keine Notwendigkeit für das Rohr sort
, awk kann alles:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
Befehl zu umgeben, der Befehl selbst jedoch bereits Anführungszeichen im Befehl find verwendet. Um dies zu beheben, würde ich die bash
wörtliche String-Syntax folgendermaßen verwenden:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
am Ende des Befehls 'find' hinzu und führen Sie Ihren Test erneut aus.
Rekursive Version:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Wenn Sie Summen möchten (wie oft wurde die Erweiterung gesehen):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Nicht rekursiv (einzelner Ordner):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Ich habe dies auf diesem Forumbeitrag basiert , Kredit sollte dort gehen.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Power Shell:
dir -recurse | select-object extension -unique
Vielen Dank an http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
in aufgenommen (z. B. jquery-1.3.4
wie .4
in der Ausgabe). Wechseln Sie zu dir -file -recurse | select-object extension -unique
, um nur Dateierweiterungen zu erhalten.
Meine awk-less, sed-less, Perl-less, Python-less POSIX-kompatible Alternative:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Der Trick ist, dass es die Linie umkehrt und die Erweiterung am Anfang schneidet.
Außerdem werden die Erweiterungen in Kleinbuchstaben konvertiert.
Beispielausgabe:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
hat nicht die volle Flagge --count
, -c
funktioniert aber
Finde alles mit einem Punkt und zeige nur das Suffix.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
Wenn Sie wissen, dass alle Suffixe 3 Zeichen haben, dann
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
oder mit sed zeigt alle Suffixe mit ein bis vier Zeichen. Ändern Sie {1,4} in den Zeichenbereich, den Sie im Suffix erwarten.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Hinzufügen meiner eigenen Variation zur Mischung. Ich denke, es ist das einfachste von allen und kann nützlich sein, wenn Effizienz kein großes Problem ist.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
Verwenden Sie in Python Generatoren für sehr große Verzeichnisse, einschließlich leerer Erweiterungen, und ermitteln Sie, wie oft jede Erweiterung angezeigt wird:
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
Ich habe hier eine Reihe von Antworten ausprobiert, sogar die "beste" Antwort. Sie alle kamen zu kurz, was ich speziell wollte. Abgesehen von den letzten 12 Stunden, in denen ich für mehrere Programme im Regex-Code gesessen und diese Antworten gelesen und getestet habe, habe ich mir genau das ausgedacht, was genau so funktioniert, wie ich es möchte.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Wenn Sie eine Anzahl der Dateierweiterungen benötigen, verwenden Sie den folgenden Code
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Obwohl diese Methoden einige Zeit in Anspruch nehmen und wahrscheinlich nicht die besten Methoden sind, um das Problem zu lösen, funktionieren sie.
Update: Per @ alpha_989 verursachen lange Dateierweiterungen ein Problem. Das liegt an der ursprünglichen Regex "[[: alpha:]] {3,6}". Ich habe die Antwort aktualisiert und den regulären Ausdruck "[[: alpha:]] {2,16}" eingefügt. Jeder, der diesen Code verwendet, sollte sich jedoch darüber im Klaren sein, dass diese Zahlen die Mindest- und Höchstwerte für die Dauer der Erweiterung für die endgültige Ausgabe sind. Alles, was außerhalb dieses Bereichs liegt, wird in der Ausgabe in mehrere Zeilen aufgeteilt.
Hinweis: Der ursprüngliche Beitrag lautete "- Greift nach Dateierweiterungen zwischen 3 und 6 Zeichen (passen Sie die Zahlen einfach an, wenn sie nicht Ihren Anforderungen entsprechen). Dies hilft, Cache-Dateien und Systemdateien zu vermeiden (Systemdateibit dient zum Durchsuchen des Gefängnisses). ""
Idee: Kann verwendet werden, um Dateierweiterungen über eine bestimmte Länge zu finden über:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Wobei 4 die Länge der einzuschließenden Dateierweiterungen ist und dann auch alle Erweiterungen über diese Länge hinaus gefunden werden.
Da es bereits eine andere Lösung gibt, die Perl verwendet:
Wenn Sie Python installiert haben, können Sie auch (über die Shell) Folgendes tun:
python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"
Keine der Antworten befasst sich bisher ordnungsgemäß mit Dateinamen mit Zeilenumbrüchen (mit Ausnahme von ChristopheDs, die gerade eingingen, als ich dies tippte). Das Folgende ist kein Shell-Einzeiler, funktioniert aber und ist relativ schnell.
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf
Ich glaube, dieser wurde noch nicht erwähnt:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Ich habe es einfach und schnell gefunden ...
# find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
# cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt
Die akzeptierte Antwort verwendet REGEX und Sie können mit REGEX keinen Alias-Befehl erstellen. Sie müssen ihn in ein Shell-Skript einfügen. Ich verwende Amazon Linux 2 und habe Folgendes ausgeführt:
Ich habe den akzeptierten Antwortcode in eine Datei eingefügt, indem ich:
sudo vim find.sh
Fügen Sie diesen Code hinzu:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Speichern Sie die Datei, indem Sie Folgendes eingeben: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), verwenden Siefind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
source