linux находит файлы с необязательным символом в названии - PullRequest
0 голосов
/ 02 июля 2018

предположим, у меня есть два файла: ac и abc. Я хочу найти регулярное выражение для сопоставления обоих файлов. Обычно я ожидаю, что сработает следующее регулярное выражение, но оно никогда не работает:

find ./ -name ab?c

Я пытался убежать или нет с вопросительным знаком, кажется, это никогда не работает. Обычно в документации по регулярным выражениям я нашел; ? означает: предыдущий символ повторяется 0 или 1 раз , но find, похоже, этого не понимает.

Я пробовал это на двух разных версиях поиска: GNU find версии 4.2.31 и find (GNU findutils) 4.6.0

PS: это работает с *, но я специально хотел бы сопоставить только один необязательный символ .

find ./ -name a*c

дает

./ac
./abc

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Другие ответы достаточно хороши, чтобы найти решение, но знание соответствия find -regex для всей записи крайне важно. Так что вы не можете просто выполнить частичное совпадение:

-regex 'ab?c'

Вы должны использовать одну или две точки:

-regex '.*ab?c.*'

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

ls . | grep 'ab\?c' 
0 голосов
/ 02 июля 2018

Параметр find -name использует шаблон glob, который не совпадает с регулярным выражением. Для глобусов ? означает любой отдельный символ. Если вы хотите, чтобы символ был необязательным, вам нужно использовать два шаблона:

find ./ -name abc -o -name ac
0 голосов
/ 02 июля 2018

Выражение, переданное -name, не является регулярным выражением, это выражение glob. (Одно) выражение glob не может быть использовано для вашего случая использования, но вы можете использовать регулярные выражения, используя -regex:

find -regex '.*/ab?c'

Кстати, языком регулярных выражений по умолчанию является Emacs Style, как описано здесь: https://www.emacswiki.org/emacs/RegularExpression. Вы можете изменить язык регулярных выражений, используя -regextype.

0 голосов
/ 02 июля 2018

Чтобы сопоставить выражение с только одним необязательным символом , попробуйте использовать параметр or:

touch abc ac abbc
find . -name "a?c" -or -name "ac"

Дает вам только: abc и ac имен.

Как правило, вы можете создавать довольно сложные запросы поиска, используя or и and options =)

...