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

时间:2012-01-16 22:48:22

标签: unix find bsd

我想找到给定根目录中包含文件名中任意扩展名的任何文件。 我看到这篇文章: How to delete all files with certain suffix before file extension

基于这些信息,我尝试了这个:

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

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

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

谢谢, JML

2 个答案:

答案 0 :(得分:5)

您正在寻找:

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

您错过了转义,\,或|上的字符,运算符

答案 1 :(得分:2)

这是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”或“{{1}” }”。

一些实验表明:

/foo/

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

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

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

因此,最简单的方法是安装GNU -regextype,或者对N个不同的文件扩展名进行N次单独搜索,或者一般搜索文件并使用find来捕获文件你感兴趣的是。假设你不在文件名中使用换行符(空格等都可以,但换行符不行)。