我试图用命令查找文档名称“*.{py,html}”来获得目录中所有python和html文件的列表。

然后出现了手册页:

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

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

编辑:我最终想出的答案包括各种各样的废话,而且也有点长,所以我把它作为我最初试图解决的问题的答案。如果你有更好的解决方案,请随意修改。


当前回答

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

例如

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

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

其他回答

使用-o,表示“或”:

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

您需要以编程方式构建该命令行,这并不容易。

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

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

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

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

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

或者,改用一个简单的循环:

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"

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

例如

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

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

这适用于AIX korn shell。

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

这是在寻找*。CBL或*。1天前的DMS,只在当前目录中,跳过子目录。