当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

假设有名称的文件:

batman.c
debate.c
cricketbat.c

我应该使用什么命令以及如何使用搜索标签 bat 来列出所有这些文件?

最佳答案

使用 bat Anywhere 查找文件

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

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

我有 quoted 搜索模式 *bat* 因为,如果省略引号并且文件与当前目录中的 *bat* 匹配,shell 会将 *bat* 扩展为它们的列表并将其传递给 find 。然后 find 将无法正常工作。 ( \*bat\*"*bat*" 也可以。)

要在您当前所在的文件夹中搜索(例如,您已 cd 编辑到的文件夹),请像往常一样使用 .

find . -name '*bat*'

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

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

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

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

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

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

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

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

-o 是 or 运算符。

仅匹配文件

要仅查找 regular files – 而不是文件夹、符号链接和特殊设备节点 – 您可以使用 -type f 。这经常被推荐并且有时非常合适……但通常不是您真正想要的,特别是如果您正在运行 find 以自己检查输出。如果您有与您的搜索匹配的 a symbolic link,您不想知道吗?

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

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

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

但是假设您只想查看最终指向常规文件的符号链接(而不是指向目录、设备节点等的符号链接)。这实际上更简单:使用 -xtype 而不是 -type 。如果您没有运行带有 -L 标志的 find,则符号链接上的 -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

这以 multi-column 格式提供了每个文件的详细信息,类似于(尽管不完全相同)运行 ls file 所看到的内容。

延伸阅读

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

次佳答案

最简单的方法是运行

locate bat

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

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

updatedb

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

第三种答案

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

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

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

第四种答案

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

$ 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

第五种答案

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

find / -iname '*bat*'

或者

find / -name '*bat*'

* 的意思是“任何字符”,因此搜索是在 bat 之前或之后寻找任何字符,包括无字符。 / 从根目录递归搜索,您可以使用 . 从当前目录递归搜索,或者您要搜索的绝对路径。看看 how search for files using regex in linux shell script

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12720.html,未经允许,请勿转载。