Оп здесь. Ложная тревога, что ли. У моей оболочки была проблема с использованием "!" чтобы отрицать тест в find
. Когда я заменил его на «-not», он заработал как надо.
Моя версия 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
принимает только необработанный шаблон, без разделителей и, следовательно, без завершающих параметров.
Команда
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
.