Вопрос или проблема
ИЗМЕНЕНО:
Мне нужно использовать -E для расширенных регулярных выражений.
У меня есть папка с этими файлами (просто пример):
Я пытаюсь найти все файлы, которые:
- Начинаются и заканчиваются на
#
. (например,#hi.h#
) - Заканчиваются на
~
. (например,file.txt~
)
Я могу найти файлы с одной условием или с двумя условиями, но не могу объединить оба в одном регулярном выражении.
$ find . -regex "./.*~"
./lld~
$ find . -regex "./#.*#"
./#x2#
./#x#
Но эта команда не работает:
$ find . -regex "./(.*~$)|(#.*#)"
Что я делаю неправильно? Как я могу объединить эти регулярные выражения?
find . -regex "\./#.*#\|\./.*~"
Это сработает для вас?
С -regextype
(GNU find
)
Мне нужно использовать
-E
для расширенных регулярных выражений.
Введите find . -regextype help
, чтобы узнать доступные параметры. GNU find
в моем Debian поддерживает несколько. Другие реализации find
могут поддерживать или не поддерживать -regextype
. Это работает с GNU find
:
find . -regextype posix-extended -regex '\./(.*~$|#.*#)'
Обратите внимание, я немного отладил и упростил регулярное выражение (\./.*~$|\./#.*#
тоже сработает). Другие варианты, которые работают для меня в этом конкретном случае: posix-egrep
, egrep
, posix-awk
, awk
, gnu-awk
.
Без -regextype
Эта команда:
find . -regex '\./#.*#\|\./.*~'
где |
экранированная, работает для меня. Спасибо другому ответу. Правильное экранирование (
и )
также позволяет следующему работать:
find . -regex '\./\(.*~$\|#.*#\)'
без обращения к расширенным регулярным выражениям.
С -o
Вам не нужно объединять два выражения в одно. Если эти команды работают:
find . -regex '\./.*~'
find . -regex '\./#.*#'
вы можете получить файлы, соответствующие одному регулярному выражению или другому, следующим образом:
find . -regex '\./.*~' -o -regex '\./#.*#'
Будьте осторожны: Почему find
в Linux пропускает ожидаемые результаты при использовании -o
? Если вы хотите добавить больше тестов/действий до и/или после, то вам не нужно это:
find . -test1 -test2 -regex '\./.*~' -o -regex '\./#.*#' -test3 …
а это:
find . -test1 -test2 '(' -regex '\./.*~' -o -regex '\./#.*#' ')' -test3 …
Ответ или решение
Для решения вашей задачи по поиску файлов с использованием нескольких условий в регулярных выражениях в командной строке, можно использовать утилиту find
. Предполагая, что вы используете GNU find
, есть несколько способов комбинировать регулярные выражения. Давайте рассмотрим каждый из предложенных подходов.
1. Использование -regextype
с расширенными регулярными выражениями
Вы можете использовать параметр -regextype
для указания типа регулярного выражения. В данном случае, использование posix-extended
позволит вам интегрировать оба условия в одно выражение, как показано ниже:
find . -regextype posix-extended -regex '\./(.*~$|#.*#)'
Это регулярное выражение будет находить все файлы, которые либо начинаются и заканчиваются на #
, либо заканчиваются на ~
.
2. Использование -regex
без -regextype
Если вы хотите обойтись без -regextype
, вы можете использовать экранирование для операторов |
и скобок. Например:
find . -regex '\./#.*#\|\./.*~'
Или, более аккуратно экранируя скобки, чтобы избежать путаницы:
find . -regex '\./\(.*~$\|#.*#\)'
Эти команды также выполнят выполнение условий поиска.
3. Использование логического оператора -o
Если вам не нужно объединять регулярные выражения, вы можете использовать логический оператор -o
(или), чтобы отдельно проверить каждое условие:
find . -regex '\./.*~' -o -regex '\./#.*#'
Этот подход обеспечивает простоту и гибкость, позволяя вам легко добавлять дополнительные условия в будущем. Однако, будьте осторожны, когда добавляете дополнительные команды или проверки после -o
, так как это может изменить ожидаемое поведение. Чтобы избежать этого, заключите условия в скобки:
find . -test1 -test2 '(' -regex '\./.*~' -o -regex '\./#.*#' ')' -test3 ...
Заключение
Таким образом, в зависимости от ваших предпочтений и требуемых условий, вы можете выбрать любой из трех вышеописанных методов для поиска файлов в терминале. Если у вас возникнут дополнительные вопросы или нужно будет детально рассмотреть другие аспекты использования find
, пожалуйста, дайте знать!