find и регэкспы (regexp) [Таки РЕШЕНО]

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение sciko »

Нужно мне тут все длинные файлики выявить. Ну, и я решил сделать очень просто:

Код: Выделить всё

find ~ -iname '.{31,}'

Но не тут-то было. В ответ я ничего не получил. Вообще ничего. И сообщения об ошибке тоже.

Аналогично себя повёл grep

Код: Выделить всё

find ~| grep '.{31,}'
ЧЯДНТ? И почему?
Спасибо сказали:
Аватара пользователя
0ut
Сообщения: 307
Статус: Злыдень
ОС: *nix

Re: find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение 0ut »

find ~| egrep '.{31,}'
Запросы ошибок к операционной системе игнорироваться не могут.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение /dev/random »

sciko писал(а):
18.11.2009 17:14
Нужно мне тут все длинные файлики выявить. Ну, и я решил сделать очень просто:

Код: Выделить всё

find ~ -iname '.{31,}'

Но не тут-то было. В ответ я ничего не получил. Вообще ничего. И сообщения об ошибке тоже.

Аналогично себя повёл grep

Код: Выделить всё

find ~| grep '.{31,}'
ЧЯДНТ? И почему?

В find опция iname не понимает регекспы, используйте опцию -regex

grep по-умолчанию использует базовые регекспы, в которых вместо {} используется \{\}. Расширенные регекспы включаются опцией -e. Кстати, find тоже поддерживает разные типы регекспов, и желательно указывать, какие вы используете.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение sciko »

0ut писал(а):
18.11.2009 17:16
find ~| egrep '.{31,}'
Не совсем то. Для меня подойдёт

Код: Выделить всё

find ~| egrep '/[^/]{31,}$'
Иначе будет проверяться не просто само имя, а весь полный путь, и он может быть длинным и сам по себе.

Кстати egrep== grep -e


/dev/random писал(а):
18.11.2009 17:20
В find опция iname не понимает регекспы, используйте опцию -regex
Не совсем так:

Код: Выделить всё

man find|grep -A3 'iname'
       -iname pattern
              Like -name, but the match is case insensitive.  For example, the patterns `fo*' and `F??' match the file names `Foo', `FOO', `foo', `fOo', etc.   In these patterns, unlike  file‐
              name expansion by the shell, an initial '.' can be matched by `*'.  That is, find -name *bar will match the file `.foobar'.   Please note that you should quote patterns as a mat‐
              ter of course, otherwise the shell will expand any wildcard characters in them.


-regex отличается от name/iname опять же тем, что полный путь смотрит. Но

Код: Выделить всё

find ~ -regextype posix-egrep -regex '/[^/]{31,}$'
не срабатывает в отличии от

Код: Выделить всё

find ~| egrep '/[^/]{31,}$'
Почему?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение /dev/random »

sciko писал(а):
18.11.2009 17:47
Но

Код: Выделить всё

find ~ -regextype posix-egrep -regex '/[^/]{31,}$'
не срабатывает в отличии от

Код: Выделить всё

find ~| egrep '/[^/]{31,}$'
Почему?

find ~ -regextype posix-egrep -regex '.*/[^/]{31,}$'
Он ожидает _полного_ совпадения, а не нахождения подстроки.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: find и регэкспы (regexp) [Таки РЕШЕНО]

Сообщение sash-kan »

sciko писал(а):
18.11.2009 17:47
Не совсем так:
совсем так.
filename expansion — это не совсем (imho, совсем не) то же самое, что и regular expressions.
отличаются и синтаксис, и логика, и функциональные возможности.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: