Вопрос или проблема
Я пытаюсь перенести скрипт с Ubuntu Linux на ноутбук macOS и мне трудно правильно настроить find
с использованием регулярного выражения.
В каталоге у меня есть следующие файлы.
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip1.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip2.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip3.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip4.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip5.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip6.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip7.mp3
/Users/kevin/Documents/Audio/arn/2400/Report2400.clip8.mp3
запуск этой команды:
find . -regex 'Report2400\.clip[0-9]+\.mp3'
Я ожидаю получить 8 файлов, 8 с числом после “clip”, но ничего не возвращается.
Что я упускаю? Я знаю, что это элементарно, но я уже близок к тому, чтобы обратиться в психиатрическую больницу.
Я считаю, что это должно сработать:
find -E . -regex '.*/Report2400\.clip[0-9]+\.mp3'
Согласно man find
, вы используете -E
для получения расширенных регулярных выражений:
-E Интерпретировать регулярные выражения, следующие за -regex и -iregex
как расширенные (современные) регулярные выражения, а не базовые
регулярные выражения (BRE's). Страница руководства re_format(7) полностью
описывает оба формата.
Также, согласно man find
, вам нужно .*/
, чтобы включить весь путь:
-regex pattern
Истинно, если весь путь к файлу соответствует шаблону, используя регулярное
выражение. Чтобы соответствовать файлу с именем ``./foo/xyzzy'', вы можете использовать
регулярное выражение ``.*/[xyz]*'' или ``.*/foo/.*'', но не
``xyzzy'' или ``/foo/''.
Ответ или решение
Конечно, вот подробное техническое объяснение для решения задачи с использованием команды find
в macOS с использованием регулярных выражений (regex).
Как использовать find
и регулярные выражения на macOS
Если вы переноcите скрипт из Ubuntu на macOS, необходимо учитывать, что реализация команды find
в macOS немного отличается от большинства дистрибутивов Linux. В macOS GNU-утилиты заменены на версии BSD, что вносит некоторые нюансы в работу, особенно при использовании регулярных выражений.
Шаги для корректного поиска файлов
-
Используйте расширенные регулярные выражения: В macOS необходимо использовать флаг
-E
для активации расширенных регулярных выражений. Это аналогично использованиюegrep
в Linux. -
Учитывайте полный путь: По умолчанию команда
find
в macOS использует путь от корня текущего каталога. Это означает, что регулярное выражение должно соответствовать всему пути к файлу. -
Корректный формат команды: Для поиска файлов, которые соответствуют шаблону
Report2400.clip[0-9]+.mp3
, используйте следующий формат команды:find -E . -regex '.*/Report2400\.clip[0-9]+\.mp3'
.
/: Это позволяет функции
find` искать в полном пути начиная от текущего каталога.- Флаг
-E
: Этот флаг переводитfind
в режим использования расширенных регулярных выражений.
Почему важно использование -E
и '.*/'
?
- Расширенные регулярные выражения: Без
-E
, регулярные выражения будут интерпретироваться как базовые, что ограничивает их функциональность. - Полный путь: Регулярное выражение должно соответствовать не только имени файла, но и пути к нему. Предварительная часть выражения
'.*/'
позволяет правильно интерпретировать путь и находить файлы независимо от их вложенности.
SEO Оптимизация для профессиональной аудитории
- Ключевые слова: Используйте термины вроде "регулярные выражения macOS", "find macOS", и "расширенные регулярные выражения" для усиления видимости в поисковых системах.
- Проблема и решение: Четко обозначьте проблему и предложите конкретное решение, как это описано выше.
- Локализация: Пишите на русском языке с использованием профессиональной лексики, чтобы соответствовать ожиданиям и предпочтениям целевой аудитории.
Надеюсь, это разъяснение поможет вам успешно перенести ваш скрипт на macOS и эффективно использовать регулярные выражения в команде find
.