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.


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

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.


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).


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.