Как использовать регулярное выражение с командой поиска? - PullRequest
247 голосов
/ 27 июля 2011

У меня есть несколько изображений с именем сгенерированной строки uuid1. Например, 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Я хочу узнать все эти изображения, используя команду "find":

find . -regex "[a-f0-9\-]\{36\}\.jpg".

Но это не работает. Что-то не так с регулярным выражением? Может ли кто-нибудь помочь мне с этим?

Ответы [ 7 ]

292 голосов
/ 27 июля 2011
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

Обратите внимание, что вам нужно указать .*/ в начале, потому что find соответствует всему пути.

Пример:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

Моя версия поиска:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.
71 голосов
/ 27 июля 2011

Выражение поиска -regex соответствует полному имени , включая относительный путь из текущего каталога. Для find . это всегда начинается с ./, затем любые каталоги.

Кроме того, это emacs регулярные выражения, которые имеют другие экранирующие правила, чем обычные регулярные выражения egrep.

Если все они находятся непосредственно в текущем каталоге, то

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

должно работать. (Я не совсем уверен - я не могу заставить подсчитанное повторение работать здесь.) Вы можете переключиться на выражения egrep с помощью -regextype posix-egrep:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(Обратите внимание, что все сказанное здесь для GNU find, я ничего не знаю о BSD, который также используется по умолчанию на Mac.)

28 голосов
/ 27 июля 2011

Судя по другим ответам, похоже, что в этом может быть ошибка.

Однако вместо этого вы можете сделать это следующим образом:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

Возможно, вам придется немного настроить grep и использовать разные опции в зависимости от того, что вы хотите, но это работает.

7 голосов
/ 17 апреля 2018

Простой способ - вы можете указать. * В начале, потому что поиск соответствует всему пути.

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

поиск версии

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)
7 голосов
/ 27 июля 2011

Попробуйте использовать одинарные кавычки ('), чтобы избежать экранирования вашей строки. Помните, что выражение должно соответствовать всему пути, т.е. должно выглядеть следующим образом:

 find . -regex '\./[a-f0-9-]*.jpg'

Кроме того, похоже, что моя находка (GNU 4.4.2) знает только основные регулярные выражения, особенно не синтаксис {36}. Я думаю, вам придется обойтись без этого.

6 голосов
/ 30 марта 2016

Вы должны использовать абсолютный путь к каталогу при применении инструкции поиска с регулярным выражением. В вашем примере,

find . -regex "[a-f0-9\-]\{36\}\.jpg"

следует изменить на

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

В большинстве систем Linux некоторые дисциплины в регулярных выражениях не могут быть распознаны этой системой, поэтому вы должны явно указать -regexty, как

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
3 голосов
/ 01 сентября 2018

в Mac OS X (поиск BSD) : совпадает с принятым ответом, префикс .*/ необходим для полного пути:

$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"

man find говорит -E использует расширенную поддержку регулярных выражений

...