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?

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.


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\)"

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.


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.


+1 Bei einer sauberen und modularen Lösung treten die Leistungsengpässe normalerweise auf, wenn die aus den Suchergebnissen resultierenden Dateien verarbeitet werden.
— Cristik
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.