Znajdź pliki filtrowane według wielu rozszerzeń

52

Jaka jest poprawna składnia dla:

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

To działa, ale jest nieeleganckie:

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

Jak to zrobić, ale przy mniejszej liczbie naciśnięć klawiszy?

Dave Jarvis
źródło

Odpowiedzi:

75

Możesz łączyć różne wyrażenia wyszukiwania z operatorami logicznymi -orlub -and, więc twoja sprawa może być zapisana jako

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

To pokazuje również, że nie musisz uciekać specjalnym znakom powłoki podczas używania cudzysłowów.

Edytować

Ponieważ -orma on mniejszy priorytet niż domniemana -andpomiędzy -typei pierwsza -nameczęść nazwy umieszczona w nawiasach, jak sugerował Chris.

Benjamin Bannier
źródło
Spowoduje to również wydruk katalogów o nazwie „* .css”.
Teddy
Hmm, nawiasy w twojej zaktualizowanej wersji są trochę źle umieszczone. Poszczególne nawiasy muszą znaleźć się jako osobne parametry, aby je znaleźć , dlatego potrzebują spacji wokół nich (`` .css '') `, co powoduje utworzenie pojedynczej wartości ciągu; jest taki sam jak (np.) `` .css) ' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, a nie między nim a jego operandem).
Chris Johnsen,
15

Oto jeden ze sposobów na wykonanie pierwszej wersji:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Dennis Williamson
źródło
12

Musisz podać w nawiasach tylko pliki:

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

Bonus : jest to składnia zgodna z POSIX.

Miś
źródło
4

Często zdarza mi się, że używam egrep, dłuższych rur lub perla dla jeszcze bardziej złożonych filtrów:

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

Może to być nieco mniej wydajne, ale to zwykle nie stanowi problemu, a w przypadku bardziej złożonych rzeczy zwykle łatwiej jest je konstruować i modyfikować.

Standardowe zastrzeżenie dotyczy tego, że nie używa się tego do plików o dziwnych nazwach plików (np. Zawierających znaki nowej linii).

reinierpost
źródło
+1 dla czystego i modułowego rozwiązania, wąskie gardła wydajności zwykle występują podczas przetwarzania plików wynikającego z wyników wyszukiwania.
Cristik