Найти файлы, отфильтрованные по нескольким расширениям

52

Какой правильный синтаксис для:

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

Это работает, но не элегантно:

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

Как сделать то же самое, но с меньшим количеством нажатий клавиш?

Дейв Джарвис
источник

Ответы:

75

Вы можете комбинировать различные поисковые выражения с логическими операторами -orили -and, таким образом, ваш случай может быть записан как

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

Это также показывает, что вам не нужно экранировать специальные символы оболочки при использовании кавычек.

редактировать

Так как -orимеет более низкий приоритет, чем подразумеваемое значение -andмежду -typeпервой и первой -nameчастью имени в скобках, как это было предложено Крисом.

Бенджамин Банье
источник
Это также напечатает каталоги с именем "* .css".
Тедди
Хм, скобки в вашей обновленной версии немного неуместны. Отдельные круглые скобки должны заканчиваться как отдельные параметры для поиска , поэтому им нужны пробелы вокруг них (`" .css ")`, что приводит к единственному строковому значению; это то же самое, что (например) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, но не между ним и его« операндом »).
Крис Джонсен
15

Вот один из способов сделать вашу первую версию:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Деннис Уильямсон
источник
12

Вам нужно заключить в скобки, чтобы включить только файлы:

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

Бонус : это POSIX-совместимый синтаксис.

Тедди
источник
4

Я часто в конечном итоге использую egrep, или более длинные каналы, или perl для еще более сложных фильтров:

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

Это может быть несколько менее эффективно, но это обычно не проблема, а для более сложных вещей, как правило, легче создавать и модифицировать.

Стандартное предостережение относится к тому, чтобы не использовать это для файлов со странными именами файлов (например, содержащих переводы строки).

reinierpost
источник
+1 за чистое и модульное решение, узкие места производительности обычно возникают при обработке файлов, полученных в результате поиска.
Кристик