shell脚本:通过在文件夹中的所有文件中搜索来查找字符串? [复制]

Posted

技术标签:

【中文标题】shell脚本:通过在文件夹中的所有文件中搜索来查找字符串? [复制]【英文标题】:shell script : find a string by searching inside all the files in a folder? [duplicate] 【发布时间】:2015-09-08 14:15:21 【问题描述】:

如何在包含隐藏文件和子文件夹的文件夹中找到包含在(可能是多个)文件中的字符串?

我试过这个命令:

find . -maxdepth 1 -name "tes1t" -print0 | sed 's,\.\/,,g'

但这没有产生任何结果。

【问题讨论】:

【参考方案1】:

首先,您的maxdepth 应该是2 而不是1,现在您的find 命令不会下降到子目录中。此外,您可以在find 的输出中简单地使用grep 作为您的模式。这可以通过以下方式实现:

find . -maxdepth 2 -type f -exec grep 'pattern here' '' \;

解释:

find .在当前目录执行find-maxdepth 2 不会进一步下到子目录中。 -type f 查找每个不是目录的文件。 -exec grep 'pattern' '' 以特定模式执行 grep 语句, 包含找到的每个文件的文件名。

为 grep 添加选项以进行颜色突出显示、输出行号和/或文件名。

有关详细信息,请参阅 man findman grep

【讨论】:

或者如果您的意图是递归地遍历子目录的子目录,那么您可能根本不应该拥有-maxdepth。这个问题不是很清楚。 @tripleee true,我只是认为 OP 想要限制递归级别,因为他包含了该选项。我会将您的评论添加到答案中,感谢您指出这一点!【参考方案2】:

grep -Hnr PATTERN . 如果你的 grep 支持-r(递归,=-d recurse)。请注意,递归深度将没有限制。

或者试试grep -d skip -Hn PATTERN ,.[!.]*,/,.[!.]*;这应该可以工作,因为 grep 接受多个文件参数。如果您的grep 版本不支持它,请丢弃-d skip 的东西。对于没有大括号扩展的 shell,请使用手动扩展形式 * */* */.[!.]* .[!.]* .[!.]*/* .[!.]*/.[!.]*

【讨论】:

你不需要extglob。只需grep PATTERN .[!.]* * */.[!.]* */* 其中[!.] 指定“除. 之外的任何字符”(以防止进入父目录..)。 是的,这是一个病态的答案,很棒的东西!

以上是关于shell脚本:通过在文件夹中的所有文件中搜索来查找字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在文件中搜索字符串并通过 Shell 脚本将其从该文件中删除 [重复]

shell脚本--grep工具

Shell脚本判断文件是不是存在

shell脚本定时删除指定几天前的文件

通过shell脚本增加文件中的版本号

linux shell 问题,清除文件中的空格