Verwenden Sie `find` für mehrere Dateierweiterungen

16

Ich verwende den folgenden Befehl zum Zählen der Textzeilen in JAVA-Dateien:

find . -name '*.java' | xargs wc -l

Wie kann ich die findBefehlsparameter so ändern , dass sie mehreren Dateierweiterungen entsprechen? Zum Beispiel möchte ich die obige Operation für CPP-, C- und H-Dateien verwenden.

Xavier
quelle
Bei dieser Frage handelt es sich eigentlich um den findBefehl, da Sie dort nach übereinstimmenden Dateien suchen.
Iglvzx
1
Außerdem verwenden entweder das find -print0 | xargs -0Konstrukt oder noch besser und einfacher: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Dies vermeidet Dateinamenprobleme (Leerzeichen, neue Zeilen usw.) und ist eine (sehr) gute Gewohnheit.
Daniel Andersson

Antworten:

16

Verwenden Sie die -oOption für einen OP. Zum Beispiel würde diese Liste .cpp, .cund .hDateien:

find . -name \*.cpp -o -name \*.c -o -name \*.h
JOTN
quelle
Ah. Das muss *nicht mehr maskiert werden, wenn es als Code formatiert ist. Total übersehen. :)
Iglvzx
Ja, es dauerte drei Bearbeitungen von zwei Personen, aber wir haben es verstanden.
JOTN
2
Dies funktionierte unter OSX nicht (stimmte nur mit dem Nachnamen * .ext überein) - ich musste Klammern verwenden, wie von @smokinguns unten vorgeschlagen.
Gilead
2

Sie müssen die Option -o verwenden. Die folgende Anweisung findet beispielsweise alle PNG-, JPG- und GIF-Dateien in einem Ordner.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Ich verwende die Option -iname, damit bei der Übereinstimmung die Groß- und Kleinschreibung nicht berücksichtigt wird.

Smokinguns
quelle
1
iname ist nicht für alle Versionen von find verfügbar.
JOTN
1

Obwohl alle Antworten mehr oder weniger gleich sind, finde ich sie nicht lesbar mit mehreren Namen und Booleschen Operatoren dazwischen.

Ich denke, das könnte eine elegantere Lösung sein:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Lassen Sie uns das auflösen

  • find . findet alle Dateien rekursiv im aktuellen Pfad (ändern Sie den Pfad, falls erforderlich)
  • -type fSchränkt die Suche nur auf Dateien ein (kein allzu großer Geschwindigkeitsgewinn, aber dennoch ...)
  • | grep -EIch dies zu gewöhnen grep zu erkennen oder ( |) Operator in Mac OS X , die FreeBSD verwendet grep , GNU grep nicht braucht , dass (Check - in Ihre manDatei).
  • "\.java$|\.cpp$|\.c$"regulärer Ausdruck , die Dateien enthält , deren Namen Ende mit .java, .cppund .c(Add , die Sie brauchen)

Sie können dann die resultierende Liste zur weiteren Verarbeitung weiterleiten, z

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

In diesem Beispiel wird die DOS / Windows- CRLFZeilenende für OS X / Linux entfernt LF(dies ist auch die OS X- sedSyntax; überprüfen Sie Ihre Versionsspezifikationen).

MacMladen
quelle
Ich wollte alle Videodateitypen mit 25 verschiedenen Erweiterungsparametern finden. Dies war der einzige Ansatz, der für mich funktioniert hat. (Ubuntu 14.04 LTS)
Elder Geek