使用find(1)和grep(1)查找包含某个字符串的文件。
find . -type f -print -exec cat {} \; | grep some string
上面的命令没有打印文件路径。
我在使用。Ubuntu, bash 4
.
find . -type f -print -exec cat {} \; | grep some string
上面的命令没有打印文件路径。
我在使用。Ubuntu, bash 4
.
我使用了
grep "some string" . -R
,它工作得更快
p.s.
更复杂的使用情况
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
阅读param i解释
grep --help | grep -- -i
那是因为你给grep
输入了一个刚好包含文件名的文本流。因为你没有提供文件名作为 grep 的参数,所以不能指望它推断出匹配的行来自哪个文件。使用 xargs
:
find . -type f -print | xargs grep "some string"
因为你有GNU find/xargs,这是xargs读取文件名比较安全的方法:
find . -type f -print0 | xargs -0 grep "some string"
如果你只想要有匹配行的文件名,而不显示匹配行:
find . -type f -print0 | xargs -0 grep -l "some string"
```。
我经常在复杂的文件夹结构中搜索源代码,我发现使用以下方法很有用。
cd /your/folder/
grep -rHino "your string"
有了这些参数,不用find,我就能得到文件的完整路径和包含指定字符串的行号**。
它也很容易记住,因为它像rHino一样,通过你的搜索BASH进行搜索:)
我将通过一个简单的例子来展示它是如何工作的。
让我们用cat显示一个文件的内容。
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
让我们递归搜索所有包含 “iptables -P "的文件。
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
正如你在输出中看到的那样,我们有filename:hit row:searched string
下面是对所使用参数的更详细描述:
-r 对于每个目录操作数,递归地读取并处理该目录中的所有文件。遵循命令行中的符号链接,但跳过递归遇到的符号链接。注意,如果没有给出文件操作数,grep会搜索工作目录。这与’–directories=recurse'选项相同。
-i 打印每个匹配的文件名。当有多个文件要搜索时,这是默认的。
-n 在输出的每一行前加上输入文件中基于1的行号。
-H 打印每个匹配的文件名。当有多个文件要搜索时,这是默认的。
*-o 只打印匹配行的匹配(非空)部分,每个部分都在单独的输出行中。输出行使用与输入相同的定界符,如果同时使用-z (–null-data),定界符为空字节(参见其他选项)。
我更喜欢
|查找文件 |make grep ont finding file | show de full path of the file
find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;
Silver Searcher](https://github.com/ggreer/the_silver_searcher)是一个非常快速和方便的搜索文件和内容的工具。
要解决你的问题,silver searcher命令应该是这样的…。
ag 'some string' -l
-l
只打印包含匹配的文件名(不打印匹配的行)。