Finden Sie Dateien, die nach mehreren Erweiterungen gefiltert sind

37944
Dave Jarvis

Was ist die richtige Syntax für:

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

Das funktioniert, ist aber unerheblich:

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

Wie mache ich dasselbe, aber mit weniger Tastenanschlägen?

44

4 Antworten auf die Frage

63
Benjamin Bannier

Sie können verschiedene Suchausdrücke mit den logischen Operatoren -oroder kombinieren -and, so dass 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 besonderen Shell-Zeichen ersetzen müssen.

Bearbeiten

Da -orhat eine niedrigere Priorität als der implizierte -andzwischen -typeund der erste -nameName, der in Klammern steht, wie von Chris vorgeschlagen.

Dadurch werden auch Verzeichnisse mit dem Namen "* .css" gedruckt. Teddy vor 14 Jahren 0
Hmm, die Klammern in deiner aktualisierten Version sind ein bisschen falsch platziert. Die einzelnen Klammern müssen als separate Parameter für * find * enden, sodass sie um sie herum Leerzeichen benötigen (`" * .css "\)`, was zu einem einzelnen String-Wert führt. es ist dasselbe wie (zB) '' * .css) '`). Zweitens müssen die Klammern ganze 'Primaries' durchlaufen (die offene Klammer muss vor '-name' stehen, nicht zwischen ihr und ihrem 'Operanden'). Chris Johnsen vor 14 Jahren 0
14
Dennis Williamson

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

find -type f -regex ".*/.*\.\(shtml\|css\)" 
8
Teddy

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

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

Bonus : Dies ist eine POSIX-kompatible Syntax.

4
reinierpost

Ich finde oft, dass ich egrep oder längere Pipes oder perl für noch komplexere Filter ende:

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

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

Der Standardvorbehalt gilt für die Verwendung von Dateien mit ungewöhnlichen Dateinamen (z. B. Zeilenumbrüche).

+1 Für eine saubere und modulare Lösung treten normalerweise Leistungsengpässe auf, während die aus den Suchergebnissen resultierenden Dateien verarbeitet werden. Cristik vor 6 Jahren 0