【问题标题】:How can I "grep" for a filename instead of the contents of a file? [closed]如何“grep”文件名而不是文件的内容? [关闭]
【发布时间】:2012-04-30 00:43:07
【问题描述】:

grep 用于在文件中搜索以查看是否有任何行与给定的正则表达式匹配。但是,我有这种情况 - 我想编写一个匹配文件名本身(而不是文件内容)的正则表达式。我将从系统的根目录运行它,以查找所有与正则表达式匹配的文件。

例如,如果我想查找所有以“f”开头并以 .frm 结尾的 Visual Basic 表单文件,我将使用正则表达式 -

   "f[[:alnum:]]*\.frm"

grep 能做到这一点吗?如果没有,是否有一个实用程序可以让我这样做?

【问题讨论】:

标签: grep


【解决方案1】:

在这种情况下,您需要使用find 而不是grep

您还可以将findgrepegrep 结合使用:

$ find | grep "f[[:alnum:]]\.frm"

【讨论】:

  • 这是不必要的。 Find 使用 -regex 选项内置了该功能。
  • 这里没有必要,但是 grep 支持 perl 正则表达式,而 find 不支持。
  • @alpha_989,我说 grep 支持它,它确实支持它:gnu.org/software/grep/manual/html_node/… 点是管道到 grep 仅在需要 pcre 时才需要。哪里有正确的答案
  • @RM:不,仍然搜索文件内容。它只是打印文件名而不是打印匹配的行。
【解决方案2】:

示例

find <path> -name '*FileName*'

来自手册:

找到-name模式

文件名的基础(删除了前导目录的路径)与 shell 模式模式匹配。 因为前导目录被删除,考虑与 -name 匹配的文件名将永远不会 包括一个斜杠,所以“-name a/b”永远不会匹配任何东西(你可能需要使用 -path 代替)。这 元字符(“*”、“?”和“[]”)匹配“.”在基本名称的开头(这是 find- 实用程序-4.2.2;请参阅下面的标准一致性部分)。要忽略目录及其下的文件, 使用 -prune;请参阅 -path 描述中的示例。大括号不被认为是特殊的, 尽管包括 Bash 在内的一些 shell 在 shell 模式中赋予了括号具有特殊含义。 使用 fnmatch(3) 库函数执行文件名匹配。不要忘记 将模式括在引号中,以防止其被 shell 扩展。

【讨论】:

  • 我发现这个答案是最有用的。我添加了几个额外的选项:find . -maxdepth 1 -name "*filename*" -print
  • @JSONC11 很有用,谢谢!
【解决方案3】:

正如 Pablo 所说,您需要使用 find 而不是 grep,但无需通过管道将 find 传递给 grepfind 内置了该功能:

find . -regex 'f[[:alnum:]]\.frm'

find是一个非常强大的按名称搜索文件的程序,支持按文件类型搜索,深度限制,将不同的搜索词与布尔运算结合,对找到的文件执行任意命令。请参阅the find man page 了解更多信息。

【讨论】:

  • 我会添加非常方便的 find 功能,以便使用 -mtime-mmin 按日期搜索
  • 另外,-regex 开关对整个路径执行匹配。因此,要运行该示例,需要在正则表达式开头添加 .*。
【解决方案4】:

您可以使用树找到文件的相对路径。只需将输出通过管道传递给 grep 进行过滤:

tree -f | grep filename

这里有一个函数可以放入你的.bash_profile.bashrc.zshrc 或其他...

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

【讨论】:

  • -f 是可选的。
【解决方案5】:

最简单的方法是

find . | grep test

Herefind 将列出 (.) 中的所有文件,即 当前目录,递归。

然后它只是一个简单的 grep。所有名称为“test”的文件都会出现。

您可以根据自己的要求使用 grep。 注意:由于 grep 是一个通用的字符串分类。它不仅可以为您提供文件名。但是如果一个路径有一个目录('/xyz_test_123/other.txt'),它也将是结果集的一部分。

【讨论】:

  • 这将在路径中找到任何带有“test”的内容,例如./foo/bar/latest/fred.txt.
  • 哦。那个我没想到。谢谢你的提及。
【解决方案6】:
find -iname "file_name"

Syntax:
find -type type_descriptor file_name_here

type_descriptor 类型:

f: 常规文件

d: 目录

l: 符号链接

c:字符设备

b:块设备

【讨论】:

  • 我似乎无法单独使用 -type typedescriptor 之后的文件名。这是一个错误吗?
【解决方案7】:

你也可以这样做:

tree | grep filename

这会将 tree 命令的输出通过管道传输到 grep 以进行搜索。这只会告诉你文件是否存在。

【讨论】:

    【解决方案8】:
    find . | grep KeywordToSearch
    

    这里. 表示当前目录,它是find 命令的path 参数的值。它通过管道传送到 grep 以搜索应该返回所有匹配结果的关键字。

    注意:这是区分大小写的。所以例如fileNameFileName 是不一样的。

    【讨论】:

      【解决方案9】:

      也适用于多个文件。

      tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"
      

      【讨论】:

        【解决方案10】:

        不,grep 可以很好地解决这个问题:

         grep -rl "filename" [starting point]
        
         grep -rL "not in filename"
        

        【讨论】:

        • 这会在文件内容中搜索“filename”,然后打印匹配的文件名。 OP 想要匹配文件名,而不是文件内容。
        • 同意,这不会搜索文件名,它只会打印与 content 匹配的文件名的名称。您对 -l-L 选项的误解很大。
        猜你喜欢
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        相关资源
        最近更新 更多