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

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

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

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

Ответ 1

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

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

Пример:

[email protected]:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
[email protected]:~/so$ 
[email protected]:~/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) 
[email protected]:~/so$ 
[email protected]:~/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'.

Ответ 2

Выражение -regex find соответствует имени целиком, включая относительный путь из текущего каталога. Для 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.)

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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"

Ответ 6

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

$ 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

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

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

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