使用find命令查找特定的文件扩展名



我想在给定的根目录中找到文件名中包含任意扩展名的任何文件。我看到这个帖子:如何删除文件扩展名之前带有特定后缀的所有文件

根据这些信息,我尝试了这个:

find . -iregex ".*.(wav|aif|wave|aiff)"

这似乎应该工作,但我没有将任何结果打印到终端窗口。

有人能提供建议吗?我在OSX 10.7 上

谢谢,jml

您正在寻找:

find . -regex ".*.(wav|aif|wave|aiff)"

缺少转义符、或上的字符|、运算符

这是emacs风格的正则表达式吗?

如果没有,请尝试使用-regextype。来自Linux上的find手册页(陈旧):

  • -regextype type

    更改稍后在命令行中进行的-regex-iregex测试所理解的正则表达式语法。当前实现的类型为emacs(这是默认值)、posix-awkposix-basicposix-egrepposix-extended


在MacOS X上,find的手册页面上写着:

-iregex pattern

-regex类似,但匹配不区分大小写。

-regex pattern

如果文件的整个路径与使用正则表达式的模式匹配,则为True。若要匹配名为"./foo/xyzzy"的文件,可以使用正则表达式".*/[xyz]*"或".*/foo/.*",但不能使用"xyzzy"或"/foo/"。

一些实验表明:

find pdf -iregex ".*/.*.pdf"

在我的文件夹中发现了很多PDF文件,但这些变体都找不到任何东西:

find pdf -iregex ".*/.*.(pdf|doc|docx)"
find pdf -iregex ".*/.*.(pdf|doc|docx)"
find pdf -iregex ".*/.*.(pdf|doc|docx)"
find pdf -iregex ".*/.*.(pdf|doc|docx)"

因此,人们不得不假设MacOS X(BSD)find支持的正则表达式不包括已识别字符之间的交替(括号和管道)遗憾的是:man 7 re_format暗示它可能,但事实并非如此。在MacOSX(BSD)上似乎不支持-regextype选项。

因此,安装GNU find,或者对N个不同的文件扩展名进行N次单独搜索,或者对一般文件进行一次搜索,并使用egrep '.(aff|wave?|aiff)$'来捕获您感兴趣的文件,这可能是最简单的。这是假设您在文件名中不使用换行符(空格等可以,但换行符不行)。

最新更新