Finden Sie Dateien, die nach mehreren Erweiterungen gefiltert sind

52

Was ist die richtige Syntax für:

find . -type f -name \*.\(shtml\|css\)

Das funktioniert, ist aber unelegant:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Wie mache ich das gleiche, aber mit weniger Tastenanschlägen?

Dave Jarvis
quelle

Antworten:

75

Sie können verschiedene Suchausdrücke mit den logischen Operatoren -oroder kombinieren -and, damit Ihr Fall als geschrieben werden kann

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Dies zeigt auch, dass Sie bei der Verwendung von Anführungszeichen keine speziellen Shell-Zeichen maskieren müssen.

Bearbeiten

Da -orhat eine geringere Priorität als der -andzwischen -typeund dem ersten -namegesetzte Namensteil in Klammern, wie von Chris vorgeschlagen.

Benjamin Bannier
quelle
Dadurch werden auch Verzeichnisse mit dem Namen "* .css" gedruckt.
Teddy
Hmm, die Klammern in Ihrer aktualisierten Version sind etwas verlegt. Die einzelne Klammern müssen , um am Ende als separater Parameter zu finden , so dass sie Räume brauchen um sich herum ( `„ .css“)` Ergebnisse in einem einzigen String - Wert; es ist dasselbe wie (zB) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, nicht zwischen ihm und seinem 'Operanden').
Chris Johnsen
15

Hier ist eine Möglichkeit, Ihre erste Version zu erstellen:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Dennis Williamson
quelle
12

Sie müssen in Klammern setzen, um nur Dateien einzuschließen:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bonus : Dies ist eine POSIX-konforme Syntax.

Teddy
quelle
4

Ich stelle oft fest, dass ich egrep, längere Pipes oder Perl für noch komplexere Filter verwende:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Es mag etwas weniger effizient sein, aber das ist normalerweise kein Problem, und für komplexere Dinge ist es normalerweise einfacher zu konstruieren und zu modifizieren.

Die Standard-Einschränkung bezieht sich darauf, dass dies nicht für Dateien mit seltsamen Dateinamen (z. B. mit Zeilenumbrüchen) verwendet wird.

reinierpost
quelle
+1 Bei einer sauberen und modularen Lösung treten die Leistungsengpässe normalerweise auf, wenn die aus den Suchergebnissen resultierenden Dateien verarbeitet werden.
Cristik