Использование нескольких условий в find regex в оболочке

Вопрос или проблема

ИЗМЕНЕНО:
Мне нужно использовать -E для расширенных регулярных выражений.

У меня есть папка с этими файлами (просто пример):
структура каталога

Я пытаюсь найти все файлы, которые:

  1. Начинаются и заканчиваются на #. (например, #hi.h#)
  2. Заканчиваются на ~. (например, 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, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...