我试图用命令获取目录中所有python和html文件的列表find Documents -name "*.{py,html}"
.
然后是手册页:
模式('{}')中的大括号不被认为是特殊的(即,find.-name'foo {1,2}'匹配名为foo {1,2}的文件,而不是文件foo1和foo2.
由于这是管道链的一部分,我希望能够在运行时指定它匹配的扩展名(没有硬编码).如果找不到它,perl单行(或类似)就可以了.
编辑:我最终提出的答案包括各种各样的废话,并且有点长,所以我发布它作为我试图划伤的原始痒的答案.如果你有更好的解决方案,请随意破解.
使用-o
,表示"或":
find Documents \( -name "*.py" -o -name "*.html" \)
编辑:对不起,只需重新阅读问题...您需要以编程方式构建该命令行,这并不容易.
您使用的是bash(或Windows上的Cygwin)吗?如果你是,你应该能够这样做:
ls **/*.py **/*.html
这可能更容易以编程方式构建.
编辑:应用@artbristol评论答案.
一些版本的find,主要是在linux系统上,可能在其他版本上也支持-regex和-regextype选项,它们查找名称与正则表达式匹配的文件.
例如
find . -regextype posix-egrep -regex ".*\.(py|html)$"
应该在上面的例子中做到这一点.但是,这不是标准的POSIX查找功能,而是依赖于实现.
您可以通过编程方式添加更多-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
这将在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