Использовать модификатор с регулярным выражением команды find?

Оп здесь. Ложная тревога, что ли. У моей оболочки была проблема с использованием "!" чтобы отрицать тест в find. Когда я заменил его на «-not», он заработал как надо.

0
01.09.2021, 19:56
2 ответа

Моя версия GNU find поддерживает несколько различных вариантов регулярных выражений, которые можно выбрать с помощью-regextype:

valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.

Почти все они позволяют точке совпадать с новой строкой,... кроме emacs, которая используется по умолчанию.

Итак, используйте какой-нибудь другой.posix-extendedнаверное, достаточно вменяемый:

$ touch hello $'new\nline'
$ find. -type f -regex '.*'
./hello
$ find. -type f -regextype posix-extended -regex '.*'
./hello
./new?line

Если вы используете какой-либо другой find, ваш пробег может отличаться. При быстром тестировании тот, что на моем Mac, по умолчанию соответствует новой строке с ..

Опять же, для простых шаблонов вы можете просто использовать -name, который принимает шаблоны оболочки (и не должен иметь проблем с новыми строками ).

(?s)выглядит как особенность регулярных выражений PCRE/Perl, и я не вижу, чтобы findэто поддерживало. Что касается /.*/s, findпринимает только необработанный шаблон, без разделителей и, следовательно, без завершающих параметров.

2
01.09.2021, 20:27

Команда

find ~user

найдет все имена, в том числе содержащие символы новой строки. Добавьте -type f, если вы хотите найти только обычные файлы.

Если вы не хотите ограничивать сопоставление имен, не используйте проверку имен.

Чтобы ограничить имена, сопоставленные с использованием подстрок, вы можете использовать шаблон подстановки с тестом -name. И *, и ?соответствуют новым строкам в шаблоне подстановки, как в оболочке в целом, так и в тесте -nameв find:

.

Пример использования стандартаfind:

$ find. -name 'file?name'
./file
name
$ find. -name 'file*name'
./file
name
$ find. -name 'd*name'
./dir
name
$ echo./d*name
./dir
name

Ответ на неправильно понятый вопрос ("Как я могу найти имена, содержащие символы новой строки"):

Использование стандартаfind:

find ~user -name '*
*'

Использование «строк C -» в оболочках, поддерживающих эти (, по-прежнему использующих стандартfind)

find ~user -name $'*\n*'

Ни один из встроенных -типов регулярных выражений, обычно доступных в GNU find, не может сопоставить символ новой строки с \n, поэтому вам остается использовать буквальный перевод строки, точно так же, как в приведенных выше шаблонах подстановки. Это означает, что, вероятно, проще использовать стандартный тест -name, чем непереносимый -тест -regex.

-2
01.09.2021, 20:19

Теги

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