`find -name` pattern that matches multiple patterns
我试图用命令
接着,出现了个人主页:
Braces within the pattern (‘{}’) are not considered to be special (that is, find . -name 'foo{1,2}' matches a file named foo{1,2}, not the files foo1 and foo2.
由于这是管道链的一部分,我希望能够指定它在运行时匹配的扩展(没有硬编码)。如果find不能做到这一点,那么PerlOne(或类似的)行程序就可以了。
编辑:我最终得出的答案包括各种各样的废话,而且也有点长,所以我把它作为我试图抓挠的原始瘙痒的答案贴出来。如果你有更好的解决方案,请随意修改。
使用
1 | find Documents \( -name"*.py" -o -name"*.html" \) |
编辑:抱歉,请重新阅读问题…您需要以编程方式构建命令行,这并不容易。
您是否在使用bash(或在Windows上使用cygwin)?如果是,您应该能够做到:
1 | ls **/*.py **/*.html |
这可能更容易以编程方式构建。
编辑:对答案应用了@artbristol注释。
find的一些版本,主要在Linux系统上,也可能在其他版本上支持-regex和-regextype选项,这些选项可以查找名称与regex匹配的文件。
例如
1 | find . -regextype posix-egrep -regex".*\.(py|html)$" |
应该在上面的例子中完成这个技巧。但是,这不是标准的posix find函数,它依赖于实现。
您可以通过程序添加更多的
1 | find Documents \( -name"*.py" -or -name"*.html" \) |
或者,换一个简单的循环:
1 | for F in Documents/*.{py,html}; do ...something with each '$F'... ; done |
我也有同样的需求。这对我很有用:
1 | find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print |
这将在Linux上找到所有.c或.cpp文件
1 | $ find . -name"*.c" -o -name"*.cpp" |
你不需要转义括号,除非你做了一些额外的修改。在这里的手册页上,他们说如果图案匹配,打印出来。也许他们正在努力控制印刷。在这种情况下-print充当条件并成为"an d'd"条件。它将阻止打印任何.c文件。
1 | $ find . -name"*.c" -o -name"*.cpp" -print |
但是如果你喜欢原始答案,你可以控制打印。这也可以找到所有.c文件。
1 | $ find . \( -name"*.c" -o -name"*.cpp" \) -print |
我的默认值是:
与Brendan Long和Stephan202等人所作的较不具过程意图的
find Documents \( -name"*.py" -or -name"*.html" \)
1 2 3 4 5 6 | #! /bin/bash filetypes="*.py *.xml" for type in $filetypes do find Documents -name"$type" done |
简单但有效:)
1 2 3 4 5 | find MyDir -iname"*.[j][p][g]" + find MyDir -iname"*.[b][m][p]" = find MyDir -iname"*.[jb][pm][gp]" |
我需要删除子目录中的所有文件,除了一些文件。以下对我有效(指定了三种模式):
1 | find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' + |
怎么样
1 | ls {*.py,*.html} |
它在文件名中列出以.py或.html结尾的所有文件
这在AIXKornShell上工作。
1 | find *.cbl *.dms -prune -type f -mtime -1 |
这是在当前目录中查找一天以前的