2

В сети есть так много таких вопросов, но я не смог решить эту простую проблему.

У меня есть каталог с большим количеством изображений, но я хочу скопировать только подмножество их, идентифицированных диапазонами чисел. Каждое изображение имеет формат: « [random characters][capture number].BMP "

Например: IZ000561.BMP

Я использую это вместе с find и опцией -regex . Регулярное выражение, которое я думал использовать, было простым:

.*(26[2-7]|27[0-2]).*

если бы я хотел сопоставить изображения с тегом [262-267], [270-272]. Однако этот подход не удался. Я пошел к онлайн- тестеру Regex и все совпал, как и ожидалось, используя это выражение. Должно быть, механизм find регулярных выражений ожидает другого формата для этого вида фильтрации.

Полная команда, которую я использовал:

find /path/to/images/ -regex ".*(26[2-7]|27[0-2]).*" -exec echo {} \;

Что является правильным выражением того, что я пытаюсь сделать?

3 ответа3

3

Я понимаю, что вы опубликовали свой собственный ответ, но если вы хотите использовать синтаксис REGEX, который вы используете, вы можете изменить тип REGEX с помощью этой команды:

-regextype TYPE

Поэтому я верю, чтобы твоя работа

find /path/to/images/ -regextype sed -regex '.*(26[2-7]|27[0-2]).*' -exec echo {} \;

может сделать свое дело.

Кроме того, просто обратите внимание, ваше регулярное выражение будет соответствовать всему с 262-267 или 270-272 внутри. Это означает, что он поймает IZ262561.BMP , а также IZ134267.JPG и ASDNASDNOANFOIAJFOIJDIO000262.EXE например. Я не уверен, с какими файлами вы работаете, но вам, возможно, придется сузить свое регулярное выражение, так как оно довольно свободно от того, что он примет.

2

Также есть команда -or (или -o) для команды find . Вы можете разделить свое выражение на два подвыражения:

find /path/to/images/ -regex ".*(26[2-7]).*" -o -regex ".*(27[0-2]).*" -exec echo {} \;

-o совместима с POSIX, а -or не:

Согласно find странице поиска:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

   expr1 -or expr2
          Same as expr1 -o expr2, but not POSIX compliant.
1

Чтение справочной страницы find дает немного полезной информации:

Регулярные выражения, понимаемые с помощью find, по умолчанию являются регулярными выражениями Emacs.

Итак, взглянем на синтаксис Emacs Regex

Кажется, что все специальные символы должны быть экранированы с \ . С учетом этого ожидаемые результаты были получены после изменения регулярного выражения на следующее:

find /path/to/images/ -regex ".*\(26[2-7]\|27[0-2]\).*" -exec echo {} \;

Я проконсультировался с man-страницей, прежде чем опубликовать этот вопрос, но, видимо, недостаточно тщательно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .