
По сути, я хочу знать, как запустить 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"
Каплах!