Використання оператора Regex “АБО” з командою find


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

Я розумію, що ви розмістили власну відповідь, але у випадку, якщо ви хочете використовувати синтаксис 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наприклад. Я не впевнений, з якими файлами ви працюєте, але, можливо, вам доведеться звузити свій регулярний вираз, оскільки він досить вільний від того, що він прийме.


+1 для пропозиції, щоб зробити вираз більш конкретним. Цифри завжди супроводжуються .BMPрозширенням, тому це чудовий спосіб зробити це. Я помітив аргумент щодо зміни типу регулярних виразів, але в посібнику для його використання не було прикладів чи дійсних типів для використання з цим перемикачем. Дякую!
sherrellbc

Я намагався вводити в невірному параметрі з допомогою -regextypeопції і, звичайно ж , findповідомили підтримувані опції , як: findutils-default, awk, egrep, ed, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended, posix-minimal-basic, sed.
sherrellbc

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

Читання на сторінці man findдає трохи корисної інформації:

Регулярні вирази, зрозумілі під знахідкою, за замовчуванням регулярні вирази Emacs.

Отже, вивчивши синтаксис Emacs Regex

введіть тут опис зображення

Здається, що потрібно уникати всіх спеціальних символів \. Враховуючи це, очікувані результати були отримані після зміни регулярного виразу на таке:

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

Перед тим, як опублікувати це питання, я ознайомився зі сторінкою чоловіка, але, мабуть, недостатньо ретельно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.