1

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

2 ответа2

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 содержит . следуют буквы или цифры.

0
find dir -regex '.*/[^/]*love[^/]*$'

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