我想在 Linux(本例中为 Ubuntu)上的主文件夹中找到包含与特定正则表达式匹配的所有文件。是否有一个简单的 Unix 命令可以用来执行此操作?
例如,我想查找我的主文件夹中名称包含以下正则表达式匹配项的所有文件(此处使用 Javascript 样式表示法):((R|r)eading(T|t)est(D|d)ata)
答案1
Find 的-name
选项支持文件通配。它还支持一组有限的类似正则表达式的选项,例如有限的方括号表达式,但对于实际的正则表达式匹配,请使用-regex
.
如果您正在寻找匹配的内容文件的,grep -r
按照克雷格的建议使用。
如果要匹配文件名,请使用find
其-regex
选项:
find . -type f -regex '.*[Rr]eading[Tt]est[Dd]ata.*' -print
请注意正则表达式中的转变,因为find
在其正则表达式中不支持括号内的原子。如果您碰巧使用的是 Linux 系统,GNU find 支持一个-regextype
选项,可以为您提供更多控制:
find . -regextype posix-extended -regex '.*((R|r)eading(T|t)est(D|d)ata).*' -print
请注意,如果您要查找的只是大小写匹配,-iregex
甚至-iname
可能就足够了。如果您使用bash
作为 shell,Gilles 的 globstar 解决方案也应该可以工作。
答案2
grep
有一个递归-r
选项,它将在每个子目录中的每个文件中搜索该模式。
该-l
选项仅列出包含该模式的文件。如果您想要每个文件中的匹配项计数,请使用-c
-l 或 -c,如果您想查看匹配项,请不要使用 -l 或 -c。
(R|r)
只是一种冗长的写法[Rr]
。它也比类慢(但还不够重要,除非它处于运行数百万次的循环中):grep -lr '[Rr]eading[Tt]est[Dd]ata' ~/
完全不区分大小写:
grep -lir 'readingtestdata' ~/
如果您只想搜索 ~ 中的文件而不是子目录中的文件,那么您可以使用
find
:find ~/ -maxdepth 1 -type f -print0 | xargs -0r grep -l '[Rr]eading[Tt]est[Dd]ata'
答案3
贝壳有通配符与通常的正则表达式语法不同:?
匹配任何单个字符、*
匹配任意数量的字符以及[abc]
匹配a
,b
或之间的任何单个字符c
。以下命令显示((R|r)eading(T|t)est(D|d)ata)
当前目录中名称与扩展正则表达式1匹配的所有文件:
echo *[Rr]eading[Tt]est[Dd]ata*
如果您还想在子目录中查找文件,请首先运行shopt -s globstar
(您可以将此命令放在您的 中~/.bashrc
)。这将打开**
模式以匹配任何级别的子目录:
echo **/*[Rr]eading[Tt]est[Dd]ata*
Shell 通配符不像正则表达式那么强大。例如,没有 or ( |
) 运算符。您可以获得正则表达式的强大功能,但由于历史原因而使用不同的语法。添加shopt -s exgblob
到您的.bashrc
,然后您可以使用@(foo|bar)
匹配foo
or bar
(如foo|bar
在 ERE 中)、*(pattern)
匹配任意次数出现的序列pattern
(如(pattern)*
在 ERE 中)、+(pattern)
匹配一次或多次出现、?(pattern)
匹配零次或一次出现!(pattern)
以及匹配除任何内容pattern
(无 ERE 等效项)。
1 “扩展正则表达式”(简称 ERE)是 JavaScript 使用的正则表达式语法的 unix 名称。
答案4
您只需传递您的模式即可找到:
$ find . -type f -name "[Rr]eading[Tt]est[Dd]ata*"
对于问题中的特定模式,您可以简单地使用不区分大小写的查找:
$ find . -type f -iname readingtestdata