Совпадение с шаблоном регулярных выражений только в filename.extension

2

Мне нужно использовать, findчтобы найти файл, соответствующий шаблону регулярных выражений, filename.extensionа не по умолчанию, который соответствует /path/to/filename.extension.

Например:

/folder
  |--a-love-song.ogg
  |--a-jazz-song.ogg
  +--love-songs
       +--a-blues-song.ogg

И я хочу найти в /folderего подкаталогах файлы с .*love.*именем файла:

debian@debian:~$ find folder -regex ".*love.*"
folder/a-love-song.ogg
folder/love-songs                   # Shouldn't be returned
folder/love-songs/a-blues-song.ogg  # Shouldn't be returned

Я прочитал справочную страницу и понял, что есть опция -name, которая ищет только имя файла, но, похоже, не разрешает регулярное выражение и -name -regexне работает.

Я пытался использовать регулярные выражения, чтобы игнорировать путь:

debian@debian:~$ find folder -regex "\/.*love.*$"

Но это ничего не вернуло. Конечно, ls | grepбудет работать, но он не возвращает путь к файлу, который мне нужен, чтобы узнать, где находится файл.

Alex
источник

Ответы:

2

Вы упоминаете, что lsс grepбудет работать, если вы получили полный путь к файлу, как насчет findи grep? Потому что grepвозвращает строку, если в любом месте этой строки найдено совпадение, ваше регулярное выражение может сопоставить что-то, что не хватает /s перед именем файла и все еще содержит строку поиска.

$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'

Это похоже на работу для меня. Сопоставление расширений может быть уменьшено, если вы знаете, что во всех ваших расширениях отсутствуют номера или если вы знаете, что все файлы, которые вы хотите сопоставить, имеют определенное расширение.


Пример использования

$ find folder
folder
folder/a-love-song.ogg
folder/love-songs
folder/love-songs/a-blues-song.ogg
folder/love-songs/another-love-song.ogg
$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'
folder/a-love-song.ogg
folder/love-songs/another-love-song.ogg

Попытка объяснения регулярного выражения

  • [^/]*: Соответствует любому количеству символов, которые не являются /
  • love[^/]*: Соответствует строке, loveа затем любому количеству символов, которые не являются/
  • \.[a-z0-9]*: Соответствует a, .а затем любому количеству букв или цифр

Соберите вместе, [^/]*love[^/]*\.[a-z0-9]*соответствует как можно большему количеству не- /символов на каждой стороне loveс расширением, прикрепленным к концу. Учитывая строку, a/love/path/love-file.oggвышеприведенное регулярное выражение только соответствует love-file.ogg. Если конечная папка содержит love, например:, a/path/love-leafона не совпадает, потому что не love-leafсодержит никаких следов, .за которыми следуют буквы или цифры.

дождь
источник
Ухоженная. Не могли бы вы объяснить, какое колдовство вы там делали? Я имею в виду часть регулярных выражений.
Алекс
@ Алекс, я могу попробовать! Если вы все еще в замешательстве, я рекомендую regexpal.com . Это отличный ресурс для визуализации регулярных выражений и их соответствия.
дождь
0
find dir -regex '.*/[^/]*love[^/]*$'
grawity
источник
Это ничего не вернуло (да, я заменил каталог на каталог).
Алекс
Исправлено регулярное выражение.
Гравитация
@grawity Это все еще возвращает dir/love-songs(или любой листовой каталог с loveв нем). Я не уверен, возможно ли то, что @Alex желает только в findодиночку.
дождь