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

37834
Dave Jarvis

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

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

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

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

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

44

4 ответа на вопрос

63
Benjamin Bannier

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

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

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

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

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

Это также напечатает каталоги с именем "* .css". Teddy 14 лет назад 0
Хм, скобки в вашей обновленной версии немного неуместны. Отдельные скобки должны заканчиваться как отдельные параметры для * find *, поэтому им нужны пробелы вокруг них (`" * .css "\)` приводит к единственному строковому значению; это то же самое, что (например) `'* .css)'`). Во-вторых, круглые скобки должны обходить целые «основные цвета» (открытые скобки должны быть перед `-name`, а не между ним и его" операндом "). Chris Johnsen 14 лет назад 0
14
Dennis Williamson

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

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

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

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

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

4
reinierpost

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

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

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

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

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