Что является правильным синтаксисом для:
find . -type f -name \*.\(shtml\|css\)
Это работает, но неэлегантно:
find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt
Как сделать то же, но в меньшем количестве нажатий клавиш?
Можно объединить различные поисковые выражения с логическими операторами -or
или -and
, таким образом, Ваш случай может быть записан как
find . -type f \( -name "*.shtml" -or -name "*.css" \)
Это также показывает, что Вы не должны выходить из специальных символов оболочки при использовании кавычек.
Править
С тех пор -or
имеет более низкий приоритет, чем подразумеваемое -and
между -type
и первое -name
поместите заглавную роль в круглые скобки, как предложил Chris.
Вот один способ сделать Вашу первую версию:
find -type f -regex ".*/.*\.\(shtml\|css\)"
Я часто заканчиваю с помощью egrep, или более длинные каналы или жемчуг для еще более сложных фильтров:
find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'
Это может быть несколько менее эффективно, но это обычно не беспокойство, и для более сложного материала обычно легче создать и изменить.
Стандартный протест применяется о не использовании этого для файлов со странными именами файлов (например, содержащий новые строки).