【问题标题】:Find all files with name containing string [closed]查找名称包含字符串的所有文件[关闭]
【发布时间】:2012-07-04 22:50:47
【问题描述】:

我一直在寻找一个命令,该命令将从当前目录返回文件名中包含一个字符串的文件。我见过locatefind 命令可以找到以first_word* 开头或以*.jpg 结尾的文件。

如何返回文件名中包含字符串的文件列表?

例如,如果2012-06-04-touch-multiple-files-in-linux.markdown 是当前目录中的一个文件。

我怎样才能返回这个文件和其他包含字符串touch 的文件?使用find '/touch/'等命令

【问题讨论】:

标签: linux unix command-line locate


【解决方案1】:
find / -exec grep -lR "{test-string}" {} \;

【讨论】:

  • 这个答案被标记为低质量。请说明您提议的更改的作用。
【解决方案2】:

已经提供的许多解决方案的替代方法是使用 glob **。当您使用 bash 和选项 globstar (shopt -s globstar) 或使用 zsh 时,您可以只使用 glob **

**/bar

执行递归目录搜索名为bar 的文件(可能包括当前目录中的文件bar)。请注意,这不能与同一路径段内的其他形式的通配符结合使用;在这种情况下,* 运算符会恢复到它们通常的效果。

请注意,zshbash 之间存在细微差别。 bash 将遍历目录的软链接,zsh 不会。为此,您必须在 zsh 中使用 glob ***/

【讨论】:

    【解决方案3】:
    grep -R "somestring" | cut -d ":" -f 1
    

    【讨论】:

    • 这似乎是对另一个问题的回答 - 但由于您没有提供任何解释,因此对于提问者或其他任何人来说,这并不明显。
    【解决方案4】:
    find $HOME -name "hello.c" -print
    

    这将在整个$HOME(即/home/username/)系统中搜索任何名为“hello.c”的文件并显示它们的路径名:

    /Users/user/Downloads/hello.c
    /Users/user/hello.c
    

    但是,它不会匹配 HELLO.CHellO.C。要匹配不区分大小写,请传递-iname 选项,如下所示:

    find $HOME -iname "hello.c" -print
    

    示例输出:

    /Users/user/Downloads/hello.c
    /Users/user/Downloads/Y/Hello.C
    /Users/user/Downloads/Z/HELLO.c
    /Users/user/hello.c
    

    传递-type f 选项以仅搜索文件:

    find /dir/to/search -type f -iname "fooBar.conf.sample" -print
    find $HOME -type f -iname "fooBar.conf.sample" -print
    

    -iname 适用于 GNU 或 BSD(包括 OS X)版本的 find 命令。如果您的 find 命令版本不支持 -iname,请使用 grep 命令尝试以下语法:

    find $HOME | grep -i "hello.c"
    find $HOME -name "*" -print | grep -i "hello.c"
    

    或者试试

    find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print
    

    示例输出:

    /Users/user/Downloads/Z/HELLO.C
    /Users/user/Downloads/Z/HEllO.c
    /Users/user/Downloads/hello.c
    /Users/user/hello.c
    

    【讨论】:

      【解决方案5】:

      使用find:

      find . -maxdepth 1 -name "*string*" -print

      它会在当前目录中找到所有包含“字符串”的文件(如果你想递归删除maxdepth 1)并将其打印在屏幕上。

      如果你想避免文件包含':',你可以输入:

      find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

      如果你想使用grep(但我认为没有必要,只要你不想检查文件内容)你可以使用:

      ls | grep touch

      但是,我再说一遍,find 是更适合您的任务的更清洁的解决方案。

      【讨论】:

      • @Dru,如果你想要它“更短”,你可以避免-print,因为这是默认行为,.,因为这是它检查的默认文件夹。
      • 太棒了。我看到自己经常使用它。我将采纳您的 -print. 删除建议,将其设为命令,并尝试将 *string* 作为命令行参数传入。
      • find . -name "*string*" 也很好用。删除 . 会在我这边引发错误。再次感谢@Zagorax。
      • 只是一个观察,上面的命令抱怨-maxdepth参数的位置最好在@Sunil Dias提到的-name之前移动它
      • 我有find *.jpg -name "*from*" -print,它适用于给定的目录。如何进行递归搜索?我试过-maxdepth
      【解决方案6】:

      -maxdepth 选项应该在-name 选项之前,如下所示。,

      find . -maxdepth 1 -name "string" -print
      

      【讨论】:

      • 你必须在“字符串”前后加上*。
      【解决方案7】:

      如果字符串在名称的开头,你可以这样做

      $ compgen -f .bash
      .bashrc
      .bash_profile
      .bash_prompt
      

      【讨论】:

      • compgen 不适合这个钉子。这个很少使用的工具旨在列出可用命令,因此,它列出了当前目录中的文件(可能是脚本),它既不能递归也不能查看超过文件名的开头也不搜索文件内容,使其几乎无用。
      【解决方案8】:

      使用grep如下:

      grep -R "touch" .
      

      -R 表示递归。如果您不想进入子目录,请跳过它。

      -i 表示“忽略大小写”。您可能会发现这也值得一试。

      【讨论】:

      • 太棒了。我注意到一些文件内容遵循:。有没有办法保留它?也许使用一个选项?
      • 试试:grep -R "touch" . | cut -d ":" -f 2
      • 这似乎只产生文件的内容。不过,您基本上回答了我的问题,我可以尝试进行一些挖掘以保留内容。
      • 啊...你只需要文件名吗?运行:grep -R "touch" . | cut -d ":" -f 1(抱歉一定是误读了你)。
      • 感谢@carlspring,这很有趣。 grep 要么返回内容和文件名包含 touch 的文件,要么返回包含 touch 的内容,我不确定是哪种情况。返回的文件列表中,一半在标题中包含touch,另一半在正文中包含touch,而不是标题。刚刚意识到这一点。
      猜你喜欢
      • 2017-01-17
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2016-01-28
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多