【问题标题】:linux find file in directory with given string in contentlinux在目录中查找内容中具有给定字符串的文件
【发布时间】:2015-11-14 13:47:31
【问题描述】:

在 Linux(命令行)中:

我需要找到所有位于/users/tom/ 或其任何子目录中并且包含字符串->get( 和字符串@ 的Perl 文件(文件名以.pl.pm 结尾) 987654325@(位于不同行或同一行)。我只需要文件的名称(及其路径)。我不需要文件中找到字符串的行。

有没有可以做到这一点的命令?

我知道如何查找具有一个扩展名的文件:

find /users/tom -name "*.pl"  

但是我很难找到具有两种不同扩展名之一的文件。这些命令都不起作用:

find /users/tom -name "*.pl" -name "*.pm"  
find /users/tom -name "*.pl|*.pm"  

我的解决方法是一个接一个地做,但我想一定有更优雅的方法。

现在是文件内容:
我知道如何使用 grep 打印文件名和匹配行:

grep * -e "->get(" -e "#hyphenate"  

这列出了至少包含一个搜索字符串的所有文件。但我想要一个包含 all 搜索字符串的文件列表。

如何做到这一点? (在 Ubuntu/Linux 中形成命令行)

【问题讨论】:

  • 我不明白,为什么find /usr/tom | egrep '*.pl| *.pm' 不能工作?
  • @Aftnix:谢谢,这是我问题第 1 部分的解决方案。这给了我想要在其中搜索某些字符串的所有文件的列表。如何执行此搜索?
  • 不是一个特别好的解决方案;像find -name '*.p[lm]' 这样的标准通配符会更好。
  • TL;DR: grep -ri 'my string'

标签: linux grep find


【解决方案1】:

grep 可以递归搜索带有-r 的目录。要仅获取文件名,而不是匹配的行,请使用 -l

grep -rl -- '->get(\|#hyphenate' /users/tom | grep '\.p[lm]$'

或者,使用查找:

find /users/tom -name '*.p[lm]' -exec grep -l -- '->get(\|#hyphenate' {} +

更新

上面搜索->get( #hyphenate,如果你想要两个,你必须运行两次grep

find /users/tom -name '*.p[lm]' -exec grep -l -- '->get(' {} + \
| xargs grep -l '#hyphenate'

如果您的文件名包含空格,您可能需要为第一个grep 指定-Z,为xargs 指定-0

【讨论】:

  • 这不是一个合适的解决方案;它将列出包含任何匹配项的文件,而不是所有搜索表达式。
  • @tripleee:你是对的。我误解了这个问题。
  • @tripleee: 现在应该修复了。
【解决方案2】:

grep -r PLACE_YOUR_STRING_HERE | cut -d ' ' -f 1 | grep '.p1\|.pm'

用您要查找的模式替换字符串,然后在转到您要查找的文件夹后运行命令。

【讨论】:

    【解决方案3】:
    find /usr/tom | egrep '*.pl| *.pm' | xargs cat | grep <PATTERN>
    

    【讨论】:

    • 一个单独的* 严格来说是一个正则表达式错误,尽管大多数 grep 会简单地跳过表达式的错误部分。 ` *` 起作用的原因是偶然的,因为它允许错误空间的零重复。
    • 另外,和以往一样,唯一的catuseless;您可以在最终的grep 中添加一些标志以避免打印匹配文件的名称;但在这里,这似乎与 OP 想要的完全相反。
    猜你喜欢
    • 2012-10-19
    • 2012-12-04
    • 2013-11-09
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多