问题描述
我想查找包含特定字符串文本的所有文件。 grep
命令的作品,但我不知道如何使用它的每个目录(我只能做我的当前目录)。我尝试阅读man grep
,但没有得到任何帮助。
最佳解决办法
使用会更好
grep -rl "string" /path
哪里
-
-r
(或--recursive
)选项用于遍历/path
的所有sub-directories,而 -
-l
(或--files-with-matches
)选项仅用于打印匹配文件的文件名,而不用于匹配行(这也可以提高速度,因为grep
在与此选项首次匹配时停止读取文件)。
次佳解决办法
如果您正在寻找匹配文件的行,我最喜欢的命令是:
grep -Hrn 'search term' path/to/files
-
-H
导致打印文件名(在搜索多个文件时隐含) -
-r
执行递归搜索 -
-n
导致行号被打印
path/to/files
可以是.
在当前目录中搜索
我发现其他选项非常有用:
-
-I
忽略二进制文件(补充:-a
将所有文件视为文本) -
-F
将search term
视为文字,而不是正则表达式 -
-i
执行大小写敏感搜索 -
--color=always
强制颜色,即使通过less
管道。要制作less
支持颜色,您需要使用-r
选项:grep -Hrn search . | less -r
-
--exclude-dir=dir
用于排除像.svn
和.git
这样的目录。
第三种解决办法
我相信你可以使用这样的东西:
find /path -type f -exec grep -l "string" {} \;
来自评论的解释
find
是一个命令,可让您在给定路径的子目录中查找文件和其他对象,如目录和链接。如果您未指定文件名应符合的掩码,则枚举所有目录对象。
-
-type f
指定它应该只处理文件,而不是目录等。 -
-exec grep
指定对于每个找到的文件,它应该运行grep命令,将它的文件名作为参数传递给它,通过用文件名替换{}
第四种办法
我的默认命令是
grep -Rin string *
我使用国会大厦’R’,因为ls
使用它来递归。既然grep同时接受,没有理由不使用它。
编辑:每HVNSweeting,显然-R
将遵循符号链接,因为-r
不会。
第五种办法
如果你愿意尝试新的东西,给ack
一个镜头。递归搜索string
当前目录的命令是:
ack string
安装非常简单:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(只要你已经有目录~/bin
,并且最好在你的PATH
中。)
第六种办法
命令rgrep专门用于这种需要
如果不可用,你可以像这样得到它
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
如上所述,您可以直接设置为默认的grep选项。
我个人使用
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
相关主题:how to always use rgrep with color
第七种办法
更新2:
这条命令使用find
和grep
修复了这个问题:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
彩色输出:
$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
例:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
下面的快照中运行一个示例:
更新1:
你可以尝试下面的代码;作为.bashrc
或.bash_aliases
或脚本中的一项功能:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done }
用法:wherein /path/to/search/in/ searchkeyword
例:
$ wherein ~/Documents/ "hello world"
(注意:如@enzotib在下面的评论中所建议的,这不适用于文件/目录,包括名称中的空格。)
原帖
搜索字符串并用搜索字符串输出该行:
$ for i in $(find /path/of/target/directory -type f); do \
grep -i "the string to look for" "$i"; done
例如。:
$ for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
要显示包含搜索字符串的文件名:
$ for i in $(find /path/of/target/directory -type f); do \
if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
例如。:
$ for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;