我想在给定的根目录中找到文件名中包含任意扩展名的任何文件。我看到这个帖子:如何删除文件扩展名之前带有特定后缀的所有文件
根据这些信息,我尝试了这个:
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-awk
、posix-basic
、posix-egrep
和posix-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)$'
来捕获您感兴趣的文件,这可能是最简单的。这是假设您在文件名中不使用换行符(空格等可以,但换行符不行)。