Как использовать regex с командой find?

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

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

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

7 ответов


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:

$ 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'.

на -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.)


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

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

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

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


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

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

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


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

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"

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

$ 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)

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

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

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