`find -name`模式匹配多个模式
我试图通过命令find Documents -name "*.{py,html}"
来获取目录中所有python和html文件的列表。
接着是手册页:
模式中的花括号('{}')不被认为是特殊的(即find。-name'foo {1,2}'匹配一个名为foo {1,2}的文件,而不是文件foo1和foo2。
由于这是一个pipe道链的一部分,我希望能够指定在运行时匹配哪些扩展(无硬编码)。 如果找不到,perl单行(或类似)就可以了。
编辑:我最终想出的答案包括各种废话,也有点长,所以我张贴它作为一个答案 ,我试图从头开始痒。 随意破解,如果你有更好的解决scheme。
使用-o
,意思是“或”:
find Documents \( -name "*.py" -o -name "*.html" \)
编辑 :对不起,只是重新阅读这个问题…你需要编程build立命令行,这并不容易。
你使用bash(或Windows上的Cygwin)? 如果你是,你应该能够做到这一点:
ls **/*.py **/*.html
这可能更容易以编程方式构build。
编辑 :应用@artbristol评论的答案。
某些版本的查找,主要是在Linux系统上,可能在其他系统上,还支持-regex和-regextype选项,它们查找名称与正则expression式匹配的文件。
例如
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
#! /bin/bash filetypes="*.py *.xml" for type in $filetypes do find Documents -name "$type" done
简单,但工作:)
我的默认是:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
就像Brendan Long和Stephan202等人所做的那样,
find Documents \( -name "*.py" -or -name "*.html" \)
这将在Linux上find所有.c或.cpp文件
$ find . -name "*.c" -o -name "*.cpp"
除非你正在做一些额外的mods,否则你不需要逃跑的括号。 这里从手册页他们说如果模式匹配,打印它。 也许他们正试图控制印刷。 在这种情况下,-print作为条件而成为“AND'd”条件。 这将防止打印任何.c文件。
$ find . -name "*.c" -o -name "*.cpp" -print
但如果你喜欢原始的答案,你可以控制打印。 这将find所有.c文件。
$ find . \( -name "*.c" -o -name "*.cpp" \) -print
我需要删除子目录中的所有文件,除了某些文件。 以下为我工作(指定三种模式):
find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +
find MyDir -iname "*.[j][p][g]" + find MyDir -iname "*.[b][m][p]" = find MyDir -iname "*.[jb][pm][gp]"
这适用于AIX korn shell。
find *.cbl *.dms -prune -type f -mtime -1
这是寻找*.cbl
或*.dms
这是1天,只在当前目录,跳过子目录。
mpv --no-audio \`ls ~/Down/other/*.{mp4,flv} --color=never\`