关于shell:`find -name`模式匹配多个模式

`find -name` pattern that matches multiple patterns

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

接着,出现了个人主页:

Braces within the pattern (‘{}’) are not considered to be special (that is, find . -name 'foo{1,2}' matches a file named foo{1,2}, not the files foo1 and foo2.

由于这是管道链的一部分,我希望能够指定它在运行时匹配的扩展(没有硬编码)。如果find不能做到这一点,那么PerlOne(或类似的)行程序就可以了。

编辑:我最终得出的答案包括各种各样的废话,而且也有点长,所以我把它作为我试图抓挠的原始瘙痒的答案贴出来。如果你有更好的解决方案,请随意修改。


使用-o,意思是"或":

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

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

您是否在使用bash(或在Windows上使用cygwin)?如果是,您应该能够做到:

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

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

编辑:对答案应用了@artbristol注释。


find的一些版本,主要在Linux系统上,也可能在其他版本上支持-regex和-regextype选项,这些选项可以查找名称与regex匹配的文件。

例如

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

应该在上面的例子中完成这个技巧。但是,这不是标准的posix find函数,它依赖于实现。


您可以通过程序添加更多的-name子句,由-or分隔:

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

或者,换一个简单的循环:

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


我也有同样的需求。这对我很有用:

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


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

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

你不需要转义括号,除非你做了一些额外的修改。在这里的手册页上,他们说如果图案匹配,打印出来。也许他们正在努力控制印刷。在这种情况下-print充当条件并成为"an d'd"条件。它将阻止打印任何.c文件。

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

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

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

我的默认值是:

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

与Brendan Long和Stephan202等人所作的较不具过程意图的find执行一样:

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


1
2
3
4
5
6
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name"$type"
done

简单但有效:)


1
2
3
4
5
find MyDir -iname"*.[j][p][g]"
+
find MyDir -iname"*.[b][m][p]"
=
find MyDir -iname"*.[jb][pm][gp]"


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

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

怎么样

1
ls {*.py,*.html}

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


这在AIXKornShell上工作。

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

这是在当前目录中查找一天以前的*.cbl*.dms,跳过子目录。