`find -name`模式匹配多个模式

我试图通过命令find Documents -name "*.{py,html}"来获取目录中所有python和html文件的列表。

接着是手册页:

模式中的花括号('{}')不被认为是特殊的(即find。-name'foo {1,2}'匹配一个名为foo {1,2}的文件,而不是文件foo1和foo2。

由于这是一个pipe道链的一部分,我希望能够指定在运行时匹配哪些扩展(无硬编码)。 如果找不到,perl单行(或类似)就可以了。

编辑:我最终想出的答案包括各种废话,也有点长,所以我张贴它作为一个答案 ,我试图从头开始痒。 随意破解,如果你有更好的解决scheme。

使用-o ,意思是“或”:

 find Documents \( -name "*.py" -o -name "*.html" \) 

编辑 :对不起,只是重新阅读这个问题…你需要编程build立命令行,这并不容易。

你使用bash(或Windows上的Cygwin)? 如果你是,你应该能够做到这一点:

 ls **/*.py **/*.html 

这可能更容易以编程方式构build。

编辑 :应用@artbristol评论的答案。

某些版本的查找,主要是在Linux系统上,可能在其他系统上,还支持-regex和-regextype选项,它们查找名称与正则expression式匹配的文件。

例如

 find . -regextype posix-egrep -regex ".*\.(py|html)$" 

在上面的例子中应该做的伎俩。 但是这不是一个标准的POSIX查找函数,而是依赖于实现。

你可以编程方式添加更多的-name子句,由-or分隔:

 find Documents \( -name "*.py" -or -name "*.html" \) 

或者,去一个简单的循环,而不是:

 for F in Documents/*.{py,html}; do ...something with each '$F'... ; done 

我有类似的需求。 这对我工作:

 find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print 
 #! /bin/bash filetypes="*.py *.xml" for type in $filetypes do find Documents -name "$type" done 

简单,但工作:)

我的默认是:

find -type f | egrep -i "*.java|*.css|*.cs|*.sql"

就像Brendan Long和Stephan202等人所做的那样,

find Documents \( -name "*.py" -or -name "*.html" \)

这将在Linux上find所有.c或.cpp文件

 $ find . -name "*.c" -o -name "*.cpp" 

除非你正在做一些额外的mods,否则你不需要逃跑的括号。 这里从手册页他们说如果模式匹配,打印它。 也许他们正试图控制印刷。 在这种情况下,-print作为条件而成为“AND'd”条件。 这将防止打印任何.c文件。

 $ find . -name "*.c" -o -name "*.cpp" -print 

但如果你喜欢原始的答案,你可以控制打印。 这将find所有.c文件。

 $ find . \( -name "*.c" -o -name "*.cpp" \) -print 

我需要删除子目录中的所有文件,除了某些文件。 以下为我工作(指定三种模式):

 find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' + 
 find MyDir -iname "*.[j][p][g]" + find MyDir -iname "*.[b][m][p]" = find MyDir -iname "*.[jb][pm][gp]" 

这适用于AIX korn shell。

 find *.cbl *.dms -prune -type f -mtime -1 

这是寻找*.cbl*.dms这是1天,只在当前目录,跳过子目录。

 mpv --no-audio \`ls ~/Down/other/*.{mp4,flv} --color=never\`