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

Что является правильным синтаксисом для:

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

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

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

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

52
задан 27.03.2013, 18:17

4 ответа

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

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

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

Править

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

75
ответ дан 07.12.2019, 08:26

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

find -type f -regex ".*/.*\.\(shtml\|css\)"
15
ответ дан 07.12.2019, 08:26

Необходимо заключить в скобки, чтобы только включать файлы:

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

Премия: это - совместимый POSIX синтаксис.

12
ответ дан 07.12.2019, 08:26

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

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

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

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

4
ответ дан 07.12.2019, 08:26

Теги

Похожие вопросы