问题描述
假设有名称的文件:
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,以便匹配包含 BAT
、 bAt
等的文件,请使用 -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
和其他查找文件的方法的详细信息,请参阅:
-
find
手册页,可在线访问或通过在终端中运行man find
访问。 -
GNU findutils reference manual 提供有关
find
、locate
和xargs
实用程序的大量文档。 -
FindingFiles 中的 Ubuntu help wiki ,其中 shows how to use 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