Dateinamen mit Großbuchstaben suchen

588
40detectives

Wie finde ich alle Dateien mit ihrer Endung in Großbuchstaben rekursiv in einem Verzeichnis.

Ich habe es versucht :

$ find -name "*.[A-Z][A-Z][A-Z]" 

Scheint zu funktionieren, aber natürlich werden Dateien mit mehr als 3 Buchstaben nach dem letzten Punkt nicht geprüft.

2

2 Antworten auf die Frage

5
AFH

Die folgenden Arbeiten funktionieren für einfache Fälle:

find -name "*.*[A-Z]*" ! -name "*.*[^A-Z]*" 

Bei Dateien mit zwei oder mehr Punkten im Namen kann es zu Fehlern kommen. Für diesen Fall müssen Sie reguläre Ausdrücke verwenden, zB mit grep:

find | grep '\.[A-Z][A-Z]*$' 

oder egrep:

find | egrep '\.[A-Z]+$' 

Nach Kamil Maciorowskis Kommentar könnte die Antwort unabhängig von der Ländereinstellung gemacht werden, indem [:upper:]anstelle von A-Zwie verwendet wird:

find | egrep '\.[[:upper:]]+$' 

Ich fürchte, wir Muttersprachler können solche Dinge leicht vergessen.

Vermeiden Sie [AZ]. [So machen Sie "grep" [AZ] "unabhängig vom Gebietsschema?] (Https://stackoverflow.com/a/6800018) Kamil Maciorowski vor 5 Jahren 1
@ KamilMaciorowski - Ein gültiger Punkt, aber es war der Fragesteller, der ursprünglich vorschlug, dass [AZ] das sei, was er wollte. AFH vor 5 Jahren 0
2
Paulo

Sie können RE mit der Option -regex verwenden

find -regextype posix-egrep -regex '.*\.[A-Z]' 

Es gibt einige Punkte, die RE mit find verwenden. Das habe ich in einem pt_BR-Buch gelernt.

-regexOption will den gesamten Pfad abgleichen, also .*passt alles vor dem tatsächlichen RE, das Sie abgleichen möchten. Wenn das RE in der Mitte sein kann, .*muss am Ende ein anderes platziert werden.

Das -regextypesagt die Meta-Zeichen maskiert werden muss oder nicht.

Was ich weiß, ist, dass in Unix / BSD find -Ealle Metazeichen uncapeded sind und in GNU / Linux dasselbe ist -regextype posix-extended, -regextype posix-awkoder -regextype posix-egrep.

Weitere Informationen finden Sie im Handbuch https://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions Paulo vor 5 Jahren 0