shell script : find a string by searching inside all the files in a folder?
如何查找文件夹中(可能有多个)文件中包含的字符串(包括隐藏文件和子文件夹)?
我试过这个命令:
1
| find . -maxdepth 1 -name"tes1t" -print0 | sed 's,\.\/,,g' |
但这没有结果。
如果您的grep支持-r(递归,=-d recurse)。注意,那么递归深度就没有限制了。
或者尝试grep -d skip -Hn PATTERN {,.[!.]}*{,/{,.[!.]}*};这应该有效,因为grep接受多个文件参数。如果你的版本的grep不支持它,就扔掉-d skip的东西。对于不带撑板膨胀的壳体,使用手动膨胀形式* */* */.[!.]* .[!.]* .[!.]*/* .[!.]*/.[!.]*。
- 你不需要extglob。仅限于grep PATTERN .[!.]* * */.[!.]* */*,其中[!.]指定"除.以外的任何字符"(以防止进入父目录..)。
- @三倍棒极了。
- 是的,这是一个病态的答案,太棒了!
首先,你的maxdepth应该是2,而不是1,现在你的find命令不会在子目录中下降。此外,您可以在find的输出上对您的模式进行grep。这可以通过以下方式实现:
1
| find . -maxdepth 2 -type f -exec grep 'pattern here' '{}' \; |
说明:
- find .在当前目录下执行find。
- -maxdepth 2在子目录中不再下降。
- -type f查找不是目录的每个文件。
- -exec grep 'pattern' '{}'以某种模式执行grep语句,{}包含找到的每个文件的文件名。
向grep添加用于颜色突出显示、输出行号和/或文件名的选项。
有关更多信息,请参阅man find和man grep。
- 或者,如果目的是递归地遍历子目录的子目录,则可能根本不应该使用-maxdepth。这个问题还不太清楚。
- @Triplee是真的,我只是认为OP想要限制递归级别,因为他包含了选项。我会在回答中加上你的话,谢谢你指出这一点!