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

时间:2009-07-15 20:12:22

标签: shell find

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

然后是手册页:

  

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

由于这是管道链的一部分,我希望能够在运行时指定它匹配的扩展名(没有硬编码)。如果发现不能这样做,perl单行(或类似)就可以了。

编辑:我最终提出的答案包括各种各样的废话,并且有点长,所以我将它作为an answer发布到我试图划伤的原始痒。如果你有更好的解决方案,请随意破解。

12 个答案:

答案 0 :(得分:418)

使用-o,表示“或”:

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

编辑:抱歉,只需重新阅读问题...您需要以编程方式构建该命令行,这并不容易。

您使用的是bash(或Windows上的Cygwin)吗?如果你是,你应该能够这样做:

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

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

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

答案 1 :(得分:48)

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

例如

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

应该在上面的例子中做到了。 但是,这不是标准的POSIX查找功能,而是依赖于实现。

答案 2 :(得分:28)

您可以通过编程方式添加更多-name子句,以-or分隔:

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

或者,转而选择一个简单的循环:

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

答案 3 :(得分:11)

我有类似的需求。这对我有用:

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print

答案 4 :(得分:9)

这将在linux上找到所有.c或.cpp文件

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

除非你正在做一些额外的mod,否则你不需要转义的括号。在手册页中,他们说如果模式匹配,则打印出来。也许他们正试图控制印刷。在这种情况下,-print充当条件并成为“AND'd”条件。它将阻止打印任何.c文件。

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

但如果您喜欢原始答案,则可以控制打印。这也将找到所有.c文件。

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

答案 5 :(得分:4)

我的默认值是:

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

与Brendan Long和Stephan202等人执行的find执行程度较低一样:

  

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

答案 6 :(得分:2)

#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

简单但有效:)

答案 7 :(得分:1)

除了一些文件外,我需要删除子目录中的所有文件。以下对我有用(指定了三种模式):

find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +

答案 8 :(得分:1)

find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"

答案 9 :(得分:1)

使用\(\)的名称模式必须在模式or中加括号

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

使用and运算符输入名称模式时不需要

find Documents -type f ! -name "*.py" -and ! -name "*.html" 

答案 10 :(得分:0)

这适用于AIX korn shell。

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

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

答案 11 :(得分:0)

ls {*.py,*.html}

它列出了所有以.py或.html结尾的文件名