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

srk*_*_cb 43 command-line files search find

假设有名称的文件:

batman.c
debate.c
cricketbat.c
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*gan 66

bat随时随地查找文件

要查找/path/to/folder其中名称包含 的所有文件bat,您可以使用:

find /path/to/folder -name '*bat*'
Run Code Online (Sandbox Code Playgroud)

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

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

find . -name '*bat*'
Run Code Online (Sandbox Code Playgroud)

要搜索整个计算机,请使用/。要搜索您的主目录,请使用~或您的主目录的全名。(外壳扩展~到您的主目录的完全限定路径。)

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

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

find /path/to/folder -iname '*bat*'
Run Code Online (Sandbox Code Playgroud)

我注意到你所有的文件都以.c. 如果您只想找到这样的文件,请使用:

find /path/to/folder -name '*bat*.c'
Run Code Online (Sandbox Code Playgroud)

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

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'
Run Code Online (Sandbox Code Playgroud)

-oor运算符。

仅匹配文件

要仅查找常规文件——而不是文件夹、符号链接和特殊设备节点——您可以使用-type f. 这经常被推荐,有时非常合适......但通常不是你真正想要的,特别是如果你find为了自己检查输出而运行。如果您有一个与您的搜索匹配的符号链接,您是否不想了解它?

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

find /path/to/folder -name '*bat*' \( -type f -o -type l \)
Run Code Online (Sandbox Code Playgroud)

它使用-o运算符和括号进行分组(必须用引号引起来,以便 shell 不会对它们进行特殊处理;否则会出现语法错误)。

但是假设您只想查看最终指向常规文件的符号链接(而不是指向目录、设备节点等的符号链接)。这实际上更简单:使用-xtype代替-type. 如果您没有find使用-L标志运行,则-xtype在符号链接上测试链接指向的文件的类型。

find /path/to/folder -name '*bat*' -xtype f
Run Code Online (Sandbox Code Playgroud)

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

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

获取详细输出

find如果您未指定,则默认操作是-print。上面给出的所有命令都等价于自己,-print并在最后加上了。

find通常用于根据找到的文件运行命令——通常是进行更改的命令。但是除了-print. 特别感兴趣的是-ls

find /path/to/folder -name '*bat*' -ls
Run Code Online (Sandbox Code Playgroud)

这以多列格式提供了每个文件的详细信息,类似于(虽然不完全相同)您通过运行.ls file

进一步阅读

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

  • @mklement0 谢谢!OP 尚未[提供说明](https://askubuntu.com/questions/621063/command-to-find-files-by-searching-only-part-of-their-names/621094?noredirect=1 #comment878282_621063)关于文件的位置以及是否需要递归。由于 [chaos's answer](https://askubuntu.com/a/621078) 已经涵盖了 `ls`,我在这里专注于使用 `find` 的递归情况。当然,涵盖与某种模式(`ls` 和 `find` 与 `-maxdepth`)匹配的文件名的非(或更少)递归列表的详细答案也很有用。您可能想发布这样的答案! (2认同)

Mar*_*rby 17

最简单的方法是运行

locate bat
Run Code Online (Sandbox Code Playgroud)

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

要刷新 PC 上的文件列表,请运行

updatedb
Run Code Online (Sandbox Code Playgroud)

当您最近将新文件添加到您的帐户时运行此命令

  • @Serg 要查找新文件(比上次手动或自动运行 `updatedb` 时更新),需要先运行 `sudo updatedb`,是的。 (4认同)

kar*_*rel 15

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

find . -name "*bat*" -type f 
Run Code Online (Sandbox Code Playgroud)

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


cha*_*aos 6

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

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c
Run Code Online (Sandbox Code Playgroud)

或者(让它们一行一行):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c
Run Code Online (Sandbox Code Playgroud)

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

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
Run Code Online (Sandbox Code Playgroud)


AJe*_*iss 5

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

find / -iname '*bat*'
Run Code Online (Sandbox Code Playgroud)

或者

find / -name '*bat*'
Run Code Online (Sandbox Code Playgroud)

*意味着“任何字符”,因此搜索正在查找bat其之前或之后的任何字符,包括没有字符。/从根目录递归搜索,您可以使用which.将从当前目录或要搜索的绝对路径开始递归搜索。看看如何在linux shell脚本中使用正则表达式搜索文件