Auf einem Linux-Computer möchte ich eine Ordnerhierarchie durchlaufen und eine Liste aller darin enthaltenen Dateierweiterungen erhalten.
Was wäre der beste Weg, um dies aus einer Shell heraus zu erreichen?
linux
grep
filesystems
file-extension
GloryFish
quelle
quelle
.svn
), verwenden Siefind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
sourcegit 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:quelle
alias
Befehl zu umgeben, der Befehl selbst jedoch bereits Anführungszeichen im Befehl find verwendet. Um dies zu beheben, würde ich diebash
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:
Wenn Sie Summen möchten (wie oft wurde die Erweiterung gesehen):
Nicht rekursiv (einzelner Ordner):
Ich habe dies auf diesem Forumbeitrag basiert , Kredit sollte dort gehen.
quelle
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Power Shell:
Vielen Dank an http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
quelle
.
in aufgenommen (z. B.jquery-1.3.4
wie.4
in der Ausgabe). Wechseln Sie zudir -file -recurse | select-object extension -unique
, um nur Dateierweiterungen zu erhalten.Meine awk-less, sed-less, Perl-less, Python-less POSIX-kompatible Alternative:
Der Trick ist, dass es die Linie umkehrt und die Erweiterung am Anfang schneidet.
Außerdem werden die Erweiterungen in Kleinbuchstaben konvertiert.
Beispielausgabe:
quelle
uniq
hat nicht die volle Flagge--count
,-c
funktioniert aberFinde alles mit einem Punkt und zeige nur das Suffix.
Wenn Sie wissen, dass alle Suffixe 3 Zeichen haben, dann
oder mit sed zeigt alle Suffixe mit ein bis vier Zeichen. Ändern Sie {1,4} in den Zeichenbereich, den Sie im Suffix erwarten.
quelle
-name "."
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.
quelle
$ 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:
quelle
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.
Wenn Sie eine Anzahl der Dateierweiterungen benötigen, verwenden Sie den folgenden Code
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:
Wobei 4 die Länge der einzuschließenden Dateierweiterungen ist und dann auch alle Erweiterungen über diese Länge hinaus gefunden werden.
quelle
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:
quelle
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.
quelle
Ich glaube, dieser wurde noch nicht erwähnt:
quelle
Ich denke, der einfachste und direkteste Weg ist
Es wurde auf ChristopheDs 3. Weg modifiziert.
quelle
Sie könnten dies auch tun
quelle
Ich habe es einfach und schnell gefunden ...
quelle
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:
Speichern Sie die Datei, indem Sie Folgendes eingeben:
:wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
quelle