如何列出所有 .txt 文件及其完整路径,其中包含单词“Ubuntu”。忽略非文本文件。比较值时,您应该忽略大小写,即 UBUNTU 或 ubuNtu 或 UbUnTu 被视为等于给定的搜索短语。
答案1
GNU grep 支持基于 glob 模式的递归搜索,例如:
grep --include='*.txt' -ril ubuntu /path/to/dir
如果您不搜索正则表达式,那么如果包含固定字符串匹配 ( -F
),此过程会快得多。另一个优化是删除ignore-case ( -i
)(如果您知道不需要)。
答案2
简单的find
+grep
解决方案:
find . -type f -name "*.txt" -exec grep -li --binary-files=without-match 'ubuntu' {} \;
grep
细节:
l
- 抑制正常输出;相反,打印通常会打印输出的每个输入文件的名称i
- 忽略大小写区别,以便仅大小写不同的字符彼此匹配
答案3
该实用程序的某些实现grep
有一个-I
标志可以grep
忽略二进制文件。您还可以使用-i
不区分大小写的匹配以及-F
与固定字符串(而不是正则表达式)进行匹配。如果您正在寻找单独的字您将需要使用-w
某些grep
实现所具有的功能。然后,要递归到子目录,您可能需要使用-R
递归搜索文件并-l
获取包含模式匹配项的文件的名称。然后我们想使用--include
if 我们有 GNUgrep
来只查看具有特定扩展名的文件。
grep -Fil -IRw --include='*.txt' 'ubuntu' /path/to/top/dir
使用的标准选项:-F
、-i
、-l
。
使用的非标准选项(某些grep
实现支持):-w
, -I
, -R
, --include
。
使用find
OpenBSDgrep
哪个没有--include
,哪个使用--binary-files
代替-I
(GNUgrep
也有这个标志):
find /path/to/top/dir -type f -name '*.txt' \
-exec grep -Fil -w --binary-files=without-match 'ubuntu' {} +
答案4
这是我通常使用的:
find /path/to/top/dir -type f -name '*.txt' -exec grep -iHI ubuntu {} \;