我试图使用命令find Documents -name "*.{py,html}"
获取目录中所有python和html文件的列表。
然后是手册页:
模式中的大括号('{}')不被认为是特殊的(即,find。-name'foo {1,2}'匹配名为foo {1,2}的文件,而不是文件foo1和foo2。
由于这是管道链的一部分,我希望能够在运行时指定它匹配的扩展名(没有硬编码)。如果发现不能这样做,perl单行(或类似)就可以了。
编辑:我最终提出的答案包括各种各样的废话,并且有点长,所以我将它作为an answer发布到我试图划伤的原始痒。如果你有更好的解决方案,请随意破解。
答案 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结尾的文件名