【问题标题】:Get files which contains a specific text using Linux使用 Linux 获取包含特定文本的文件
【发布时间】:2016-12-16 09:52:50
【问题描述】:

我想在 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"

【问题讨论】:

  • find . -type f -name '*pattern*'
  • 这些将查看pattern 路径中的所有文件我想这不是你想要做的。 find 或 ls ... | grep 会有所帮助
  • 如果你还想用grep试试grep /path/to/somewhere/* -d skip -le "pattern"
  • 可能是问题令人困惑,我希望现在清楚,模式应该匹配内容而不是文件名!

标签: linux shell grep find


【解决方案1】:

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

您的问题不清楚,在原始答案中,我展示了如何找到与模式匹配的 文件名。如果你只想搜索内容匹配某个模式的文件,那么简单

grep 'pattern' directory/*

(使用 shell 通配符)。

您仍然可以使用find 过滤掉文件,然后再传递给grep:

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

原答案

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

请改用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' {} +

【讨论】:

  • 是的,grep 'pattern' * 绰绰有余。
  • 虽然它显示子目录的错误,但它可以接受的答案,thx man!
【解决方案2】:

使用find:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 2023-03-30
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多