使用Linux获取包含特定文本的文件

时间:2016-12-16 09:52:51

标签: linux shell grep find

我想在Linux中查找文件,在特定目录中,而不查看其子目录,其中包含特定字符串。从this回答,我在删除r递归后尝试了这个:

grep -nw '/path/to/somewhere/' -e "pattern"

但它不起作用。我也试着跳过目录optin:

grep -rnw -d skip '/path/to/somewhere/' -e "pattern"

我试图排除任何与当前目录不同的目录,但也没办法:

grep -rnw -exclude-dir '[^.]' '../../path/to/somewhere/' -e "pattern"

3 个答案:

答案 0 :(得分:2)

  

可能问题令人困惑,我希望现在明白,模式应该匹配内容而不是文件名!

您的问题不明确,在原始答案中我已经展示了如何找到匹配模式的文件名。如果您只想搜索内容与模式匹配的文件,那就像

一样简单
grep 'pattern' directory/*

(使用shell globbing)。

在传递给find之前,您仍然可以使用grep过滤掉文件:

find 'directory' -maxdepth 1 -mindepth 1 -type f \
  -exec grep --with-filename 'pattern' {} +

原始答案

Grep不适合搜索文件名,因为您需要在传递给Grep之前生成文件列表。即使您使用ls | grep pattern之类的命令获得了所需的结果,也必须附加另一个管道以处理文件(我猜,您很可能需要以某种方式处理它们,迟早)。 / p>

请使用find,因为它有自己强大的模式匹配功能。

示例:

find 'directory' -maxdepth 1 -mindepth 1 -regex '.*pattern'

-iregex的不区分大小写的版本使用-regex。另请阅读-name-iname-path-ipath选项。

可以使用-exec操作为正在处理的文件运行命令(或脚本),例如:

find 'directory' -maxdepth 1 -mindepth 1 -type f \
  -regex '.*pattern' -exec sed -i.bak -r 's/\btwo\b/2/g' {} +

答案 1 :(得分:1)

使用find

find '/path/to/somewhere' -maxdepth 1 -type f -exec grep -H 'pattern' {} \;

答案 2 :(得分:0)

如果模式必须是正则表达式:

ls -A /path/to/dir | grep -E PATTERN