仅在文件名.扩展名中匹配正则表达式模式

仅在文件名.扩展名中匹配正则表达式模式

我需要用 来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可以,但它没有返回文件路径,我需要这个路径才能知道文件在哪里。

答案1

您提到,如果您获得了文件的完整路径,lswith将会起作用,那么and 呢?因为如果在该行中的任何位置找到匹配项,则会返回该行,所以您的正则表达式可以匹配文件名前缺少 s 的内容,并且仍包含您的搜索字符串。grepfindgrepgrep/

$ 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不包含.后面跟着字母或数字。

答案2

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

相关内容