我需要用 来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
您提到,如果您获得了文件的完整路径,ls
with将会起作用,那么and 呢?因为如果在该行中的任何位置找到匹配项,则会返回该行,所以您的正则表达式可以匹配文件名前缺少 s 的内容,并且仍包含您的搜索字符串。grep
find
grep
grep
/
$ 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[^/]*$'