使用find定位与多个模式之一匹配的文件

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

然后出现了手册页:

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

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

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

451295 次浏览

使用-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 ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print

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

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

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

例如

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

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

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

简单但有效:)

这适用于AIX korn shell。

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

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

我的默认情况是:

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

就像Brendan Long和Stephan202等人较少的过程密集型find执行:

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

这将找到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

最后一个示例用于所有c/c++源文件

$ find . \( -name "*.c" -o -name "*.cpp"  -o -name "*.h" -o -name "*.hpp" \) -print
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"

是什么

ls {*.py,*.html}

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

对于带有or的命名模式,模式\(\)内的花括号是必需的

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

而对于带有and操作符的名称模式,则不是必需的

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