Как выполнить поиск «или» с помощью find?

Как выполнить поиск «или» с помощью find?

По сути, я хочу знать, как запустить 2 (или более) команды поиска в одной — поиск «или», а не «и»:

find . -name "*.pem"
find . -name "*.crt"

решение1

findОператор «или» для -o:

find . -name "*.pem" -o -name "*.crt"

Это короткое замыкание,то естьвторая часть будет оценена только в том случае, если первая часть ложна: файл, который соответствует, *.pemне будет проверен *.crt.

-oимеет более низкий приоритет, чем «и», как явный ( -a), так и неявный; если вы объединяете операторы, вам может потребоваться заключить часть «или» в скобки:

find . \( -name "*.pem" -o -name "*.crt" \) -print

В моих тестах это оказалось значительно быстрее, чем использование регулярного выражения, как и следовало ожидать (регулярные выражения требуют больше затрат на тестирование, чем подстановки, и -regexпроверяют полный путь, а не только имя файла, как -nameэто делается).

решение2

Пока я печатал этот вопрос, мне пришло в голову, что find по умолчанию использует подстановку, а не regex. Но я уверен, что есть способ использовать regex!

Конечно... Мне пришлось изменить regextype, чтобы использовать posix-extended, но это дало мне то, что я хотел.

find . -regextype posix-extended -regex ".*pem|.*crt"

Каплах!

Связанный контент