查找名称包含字符串的所有文件[关闭]

Posted

技术标签:

【中文标题】查找名称包含字符串的所有文件[关闭]【英文标题】: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/'等命令

【问题讨论】:

这个问题在这里有更多答案:How can I recursively find all files in current and subfolders based on wildcard matching? 【参考方案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,而不是标题。刚刚意识到这一点。

以上是关于查找名称包含字符串的所有文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

AIX:查找名称包含特定字符串的文件并将其添加到列表中

grep:查找包含单词`star`但不包含单词`start`的所有文件

如何在linux中查找包含字符串的行[关闭]

XPath 表达式查找标签名称包含“名称”的元素

linux 查找目录下包含字符串的所有文件

JPARepository,名称方法返回包含“文本”的字段[关闭]