命令通过仅搜索部分名称来查找文件?


32

假设有一些文件名为:

batman.c
debate.c
cricketbat.c

什么命令以及如何使用searchtag使用它列出所有这些文件bat


5
您是否只想在当前目录中列出匹配文件?在当前目录或当前目录下的任何目录中?系统上的任何地方?
钢铁司机

Answers:


47

bat任何地方查找文件

查找/path/to/folder名称中包含以下内容的所有文件bat,可以使用:

find /path/to/folder -name '*bat*'

我已经引述了搜索模式*bat*,因为如果报价被省略和文件匹配*bat*在当前目录中,外壳将扩大*bat*到它们的列表,并通过find。那find将无法正常工作。(\*bat\*"*bat*"也行。)

要搜索您当前所在的文件夹(例如,您曾经cd去过的文件夹).,请像往常一样使用:

find . -name '*bat*'

要搜索整个计算机,请使用/。要搜索主目录,请使用~或主目录的全名。(Shell扩展~到主目录的标准路径。)

根据名称扩大或缩小搜索范围

如果你要搜索不区分大小写的,所以包含的文件BATbAt等匹配,使用-iname测试,而不是-name测试:

find /path/to/folder -iname '*bat*'

我注意到您所有的文件都以结尾.c。如果只想查找类似的文件,请使用:

find /path/to/folder -name '*bat*.c'

我注意到您所有的文件名都bat.c后缀前面的开头或结尾处。如果您想避免匹配文件,例如embattled.c,可以使用:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oor运算子。

仅匹配文件

要仅查找常规文件(而不是文件夹,符号链接和特殊设备节点),可以使用-type f。经常建议这样做,有时是很合适的方法,但通常不是您真正想要的,特别是如果您要find自己检查输出的目的时。如果您有符号链接与您的搜索相匹配,您是否不想知道它?

如果要同时查找常规文件和符号链接,则可以使用:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

-o操作符使用运算符,并使用括号进行分组(必须加引号,以便外壳程序不会对其进行特殊处理;否则会出现语法错误)。

但是假设您只希望看到最终指向常规文件的符号链接(而不是指向目录,设备节点等的符号链接)。这实际上甚至更简单:使用-xtype代替-type。提供你没有运行find-L标志,-xtype一个符号链接测试文件类型的链接指向。

find /path/to/folder -name '*bat*' -xtype f

如果您有一个指向文件的另一个符号链接的符号链接,-xtype f即使它的直接目标是另一个符号链接而不是常规文件,也将与其匹配。这几乎总是您想要的。

人们通常认为他们想要-type f,但实际上他们想要-xtype f

获取详细的输出

find如果未指定,则默认操作是-print。上面给出的所有命令都等效于它们-print并在末尾附加了。

find通常用于根据找到的文件运行命令-通常是进行更改的命令。但是,除了以外,还有其他目的是显示结果的动作-print。特别令人感兴趣的是-ls

find /path/to/folder -name '*bat*' -ls

这将以多列格式提供有关每个文件的详细信息,类似于(尽管不完全相同)运行时所看到的信息。ls file

进一步阅读

有关find查找文件的更多信息和其他方法,请参见:


1
好的答案,尤其是-xtype建议;也许ls *bat*-maxdepth/ mindepth也值得一提。
mklement0

2
@ mklement0谢谢!OP尚未提供有关文件在何处以及是否需要递归的说明。由于混乱的回答涵盖ls了,我专注于使用递归的情况下find在这里。当然,一个详细的解答覆盖非(或更少)的匹配图案的一些文件名-recursive列表(lsfind-maxdepth)也将是有益的。您可能想要发布这样的答案!
伊莱亚·卡根

16

最简单的方法是运行

locate bat

这样,您可以在整个计算机中搜索文件名中包含“ bat”的文件

刷新PC上运行的文件列表

updatedb

最近将新文件添加到帐户时,请运行此命令


1
需求updatetdb
Sergiy Kolodyazhnyy,2015年

4
@Serg要查找新文件(updatedb比上次手动或自动运行的上次更新的文件新),sudo updatedb需要先运行,是的。
伊利亚·卡根

请注意,这将在整个系统中搜索名称匹配bat
terdon

1
@terdon我已经在回答中说明了这一点,当我已经说明了这一点时,认为它不值得被否决。
马克·柯比

1
请注意,这是一个很大的速度比find /作为locate从数据库中搜索,而find递归列表/,然后正则表达式匹配。
蒂莫西·古

14

打开终端,将目录更改为您要开始搜索的目录,然后运行以下命令:

find . -name "*bat*" -type f 

.开始从当前目录find命令。
-name字符串匹配bat,并且区分大小写。(-iname不区分大小写)
-type f仅用于文件搜索。


删除和取消删除?ok +1:P;)
AB

6

如果文件在当前目录中,请使用:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

或者(逐行显示):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

如果要在系统中搜索该文件,请使用:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
如果您的搜索从根目录开始,则可能需要添加sudo,因为此命令将报告某些文件夹的“权限被拒绝”
Sergiy Kolodyazhnyy 2015年

4

您要使用该find命令,并带有-iname用于区分大小写的文件名匹配的-name选项或用于区分大小写的文件名匹配的选项。这两个都可以让您使用通配符名称。因此,要查找包含“ bat”的任何文件名,可以使用:

find / -iname '*bat*'

要么

find / -name '*bat*'

*意思是“任何字符(S)”,因此搜索是寻找bat与任何字符,包括没有,之前或之后。在/从根目录递归搜索,你可以使用.,这将在当前目录下,或者,你想从搜索的绝对路径进行递归搜索。看看如何在Linux Shell脚本中使用正则表达式搜索文件


@EliahKagan谢谢,我在回答中添加了更多信息。
AJefferiss

+1感谢您的修改。对此,IMO 避免建议不加选择地使用它-type f,这不仅仅是简单地排除目录,而且通常不是用户真正想要的,这是它的强项。
伊莱亚·卡根

2

用好旧的find

find <path_for_search> -type f -iname "*bat*" 

例如。:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

来自man find

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
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.