查找名称包含字符串的所有文件[关闭]
Posted
技术标签:
【中文标题】查找名称包含字符串的所有文件[关闭]【英文标题】:Find all files with name containing string [closed] 【发布时间】:2012-07-04 22:50:47 【问题描述】:我一直在寻找一个命令,该命令将从当前目录返回文件名中包含一个字符串的文件。我见过locate
和find
命令可以找到以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
)。请注意,这不能与同一路径段内的其他形式的通配符结合使用;在这种情况下,*
运算符会恢复到它们通常的效果。
请注意,zsh
和 bash
之间存在细微差别。 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.C
或 HellO.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
,而不是标题。刚刚意识到这一点。以上是关于查找名称包含字符串的所有文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章