查找名称包含字符串的所有文件


177

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

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

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

如何返回此文件和其他包含字符串的文件touch?使用诸如find '/touch/'


这个问题令人困惑。您要查找包含字符串的文件还是名称包含所述字符串的文件?第一个问题用回答man grep,第二个问题用回答man find。我不知道为什么要用Google而不是用人。
某人

1
谢谢!第一句没有指定是文件内容还是文件名。更新。
Dru 2012年

Answers:


301

用途find

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

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

如果要避免文件包含“:”,则可以键入:

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

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

ls | grep touch

但是,我重复一遍,它find是为您的任务提供的更好,更清洁的解决方案。


谢谢@Zagorax。确实做到了。希望命令不是那么长,但是:)
Dru

2
@Dru,如果要避免冒号,请进行修改以涵盖此情况。find是一个非常强大的工具,必须以某种方式“冗长”。:)
Zagorax

感谢第一个在没有返回任何内容的情况下做到了完美。
Dru 2012年

3
@Dru,如果您希望它“更短”,则可以避免,-print因为这是默认行为,.也是它检查的默认文件夹。
Zagorax

1
find . -name "*string*"也很棒。删除.会导致我的错误。再次感谢@Zagorax。
Dru 2012年

14

使用grep如下:

grep -R "touch" .

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

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


大。我注意到某些文件内容后跟一个:。反正有保留吗?也许使用选项?
Dru 2012年

1
试试:grep -R "touch" . | cut -d ":" -f 2
carlspring

那似乎只产生文件的内容。尽管您基本上回答了我的问题,但我可以尝试进行一些挖掘以隐瞒内容。
Dru 2012年

啊...你只需要文件名?运行:(grep -R "touch" . | cut -d ":" -f 1 对不起,您读错了)。
carlspring

谢谢@carlspring,这很有趣。grep返回包含内容和文件名包含touch或包含内容的文件touch,我不确定是哪种情况。在返回的文件列表中,一半包含touch在标题中,另一半包含在touch正文中,而不是标题。刚刚意识到这一点。
Dru 2012年


3
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,请使用grepcommand 尝试以下语法:

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

0

如果字符串在名称的开头,则可以执行此操作

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

3
compgen不是适合此钉子的锤子。这个很少使用的工具旨在列出可用的命令,因此,它列出了当前目录中的文件(可能是脚本),并且既不能递归,也不能越过文件名的开头或搜索文件内容,从而使其大多没用。
msanford 2014年

0

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

**/bar

递归目录搜索命名bar的文件(可能包括bar当前目录中的文件)。请注意,这不能与同一路径段内的其他形式的globing结合使用;在这种情况下,*运营商将恢复其通常的效果。

请注意,zsh和之间存在细微差异bash。虽然bash会遍历到目录的软链接,但zsh不会。对于这一点,你必须使用水珠***/zsh



-2
grep -R "somestring" | cut -d ":" -f 1

2
这似乎是对另一个问题的答案-但由于您未提供任何解释,因此对于问询者或其他任何人来说都不是显而易见的。
Toby Speight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.