我想在linux下找到包含特定字符串的文件。 我尝试了类似但不能成功的事情:
找到。 -name * .txt | egrep mystring答案 0 :(得分:12)
在这里,您要将文件名(find command
的输出)作为输入发送到egrep;你真的想在文件的内容上运行egrep。
以下是两种选择:
find . -name "*.txt" -exec egrep mystring {} \;
甚至更好
find . -name "*.txt" -print0 | xargs -0 egrep mystring
检查find command help以检查单个参数的作用 第一种方法将为每个文件生成一个新进程,而第二种方法将多个文件作为参数传递给egrep;需要-print0和-0标志来处理可能讨厌的文件名(例如,即使文件名包含空格,也允许正确分隔文件名)。
答案 1 :(得分:2)
尝试:
find . -name '*.txt' | xargs egrep mystring
您的版本存在两个问题:
首先,*.txt
将首先由shell进行扩展,为您提供当前目录中以.txt
结尾的文件列表,例如,如果您有以下内容:
[dsm@localhost:~]$ ls *.txt
test.txt
[dsm@localhost:~]$
您的find
命令将变为find . -name test.txt
。试试以下内容来说明:
[dsm@localhost:~]$ echo find . -name *.txt
find . -name test.txt
[dsm@localhost:~]$
其次,egrep
不会从STDIN
获取文件名。要将它们转换为参数,您需要使用xargs
答案 2 :(得分:1)
find . -name *.txt | egrep mystring
这不会起作用,因为egrep
会在mystring
生成的输出中搜索find . -name *.txt
,这只是*.txt
文件的路径。
相反,您可以使用xargs
:
find . -name *.txt | xargs egrep mystring
答案 3 :(得分:1)
您可以使用
find . -iname *.txt -exec egrep mystring \{\} \;
答案 4 :(得分:1)
以下示例将返回所有*.log
个文件的文件路径,这些文件的行以ERROR
开头:
find . -name "*.log" -exec egrep -l '^ERROR' {} \;
答案 5 :(得分:1)
有一个来自egrep的递归选项,你可以使用
egrep -R "pattern" *.log
答案 6 :(得分:1)
如果您只想要文件名:
find . -type f -name '*.txt' -exec egrep -l pattern {} \;
如果你想要文件名和匹配:
find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;