47

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

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

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

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

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

4 ответа4

66

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

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

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

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

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

14

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

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

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

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'

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .