如何基于通配符匹配递归地找到当前文件夹和子文件夹中的所有文件?


1886

如何基于通配符匹配递归地找到当前文件夹和子文件夹中的所有文件?

Answers:


2738

为此使用查找

find . -name "foo*"

find需要一个起点,.(点)指向当前目录。


21
我知道这被标记为linux,但这值得一提:在非Linux的其他* nix变体上,该路径是必需的。在Linux上,如果要使用点,则路径是可选的。
2013年

4
@Seatter“ foo *”告诉find查找以“ foo”开头的所有文件。这只是他的例子。您可以使用“ gpio *”查找名称以gpio开头的所有文件,或者仅使用“ gpio1”查找所有名为gpio1的文件。
schumacher574 2014年

29
请注意,“ foo *”用引号引起来,因此外壳在传递它进行查找之前不会对其进行扩展。如果您只是这样做find . foo*foo*则将其展开,然后传递以查找。
格林奇

32
值得强调,这" "对于递归搜索非常必要。
WesternGun

3
也有用:如果您不希望收到没有权限的目录(或其他错误)的通知,可以这样做find . -name "foo*" 2>/dev/null
Jobbo

221

用管道发现grep通常更方便;它为您提供了用于任意通配符匹配的正则表达式的全部功能。

例如,要查找文件名中不区分大小写的字符串“ foo”的所有文件:

~$ find . -print | grep -i foo

56
find还具有-iname-regex-iregex为不区分大小写的通配符,正则表达式,和不区分大小写的正则表达式匹配的标志,因此输送至grep是不必要的。
iobender

7
我认为这不是不必要的,而是要更加方便。
伊利亚·林恩

1
但是,通过管道传递给grep -v可以允许您使用简单的字符串或正则表达式删除不需要的条目。
door_number_three

3
@iobender-很遗憾,我可以从经验中告诉您,并非所有系统都附带find支持这些选项的命令。有时grep成为唯一的选择。
拉玛先生先生


39
find -L . -name "foo*"

在某些情况下,我需要-L参数来处理符号目录链接。默认情况下,符号链接被忽略。在那些情况下,这很令人困惑,因为我将目录更改为子目录,并看到与模式匹配的文件,但是find不会返回文件名。使用-L解决了该问题。查找的符号链接选项为-P -L -H


1
l开关非常有帮助。很多时候,用户对底层目录一无所知,无论它们是软链接目录还是普通目录。因此,如果有疑问,最好使用L选项。至少,它一直对我有帮助。
Ritesh

2
那就是我的答案。谢谢!
iedmrc

33

如果您的外壳支持新的通配选项(可以通过以下方式启用shopt -s globstar),则可以使用:

echo **/*foo*

递归查找任何文件或文件夹。Bash 4,zsh和类似的shell支持此功能。


我个人已经定义了这个shell函数:

f() { find . -name "*$1*"; }

注意:以上行可以直接粘贴到shell或添加到用户~/.bashrc文件中。

然后,我可以通过键入以下内容查找任何文件:

f some_name

或者,您可以使用具有简单语法的fd实用程序,例如fd pattern


1
这只是进入单个级别。对我而言
递归

3
@Broncha因为您需要通过shopt -s globstar命令激活扩展的globing 。Bash,zsh和类似的Shell支持此功能。
kenorb

bash-3.2$ shopt -s globstarbash: shopt: globstar: invalid shell option name
提神的

@drewish您需要将Bash升级到4.x
kenorb

echo * / * foo的速度比查找的速度慢
约瑟夫·克利穆克

31

fd

如果find太慢,请尝试fd使用Utility-一种find用Rust编写的简单快捷的替代方法。

句法:

fd PATTERN

演示:

主页:https//github.com/sharkdp/fd


17
在将近9年的时间里,我第一次看到SO的gif图像。不错的工作!
Joshua Pinter

1
这些性能结果看起来很有希望。您可能会考虑将fd添加到自家酿制中……
Gr3go,

主题外:您使用什么工具来创建演示的svg文件?
aprodan

2
@aprodan演示图像是从GitHub复制的,但是我相信他们正在使用asciinema,然后转换为GIF格式,但是我不确定。
kenorb

1
实际上,它是SVG格式,因此可能asciicast2vector可以使用。
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

在通配符匹配中,您可以提供要匹配的字符串,例如* .c(对于所有c文件)


1
您的答案在这里是最正确的,因为它仅搜索指定的文件。其他未指定类型的将返回目录。
wilsotc

如果您要搜索目录,则可以将“ -type f”更改为“ -type d”
XYZ_Linux

11

您可以使用:

# find . -type f  -name 'text_for_search'

如果要使用REGX,请使用 -iname

# find . -type f  -iname 'text_for_search'

9

以下命令将列出当前文件及其子文件夹中所有具有确切名称“ pattern”的文件(例如)。

find ./ -name "pattern"


8

搜索递归文件的默认方法,在大多数情况下可用

find . -name "filepattern"

它从您所在的当前目录中开始文件名或模式的递归遍历。使用find命令,您可以使用通配符和各种开关来查看选项的完整列表,键入

man find

或者如果您的系统上没有手册页

find --help

但是,还有更多更现代,更快捷的工具可以遍历整个文件系统并为文件建立索引,其中一种常见的工具是定位或定位/定位,您应该查看操作系统的手册以了解如何安装它,安装后需要启动数据库,如果安装脚本不帮您完成,可以通过键入以下内容手动完成

sudo updatedb

并且,使用它来查找某些特定的文件类型

locate filename

或者,要从当前目录中查找文件名或模式,可以键入:

 pwd | xargs -n 1 -I {} locate "filepattern"

它将浏览其文件数据库,并快速打印出与您键入的模式匹配的路径名。要查看定位选项的完整列表,请输入: locate --helpman locate

另外,您可以配置locate通过cron作业在计划的时间更新它的数据库,因此在1AM更新db的示例cron看起来像:

0 1 * * * updatedb

这些cron作业需要由root配置,因为updatedb需要root特权才能遍历整个文件系统。


7

用于文件搜索
find / -xdev -name settings.xml ->整个计算机
find ./ -xdev -name settings.xml ->当前目录及其子目录,

用于扩展名类型的文件

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

6

令我们惊讶的是,当我们递归进行定位时,定位没有被大量使用。

我首先要找到“ $ PWD”以获取当前感兴趣的文件夹中的文件列表,然后根据需要对它们进行抓取。

locate "$PWD" | grep -P <pattern>

当然,这是假定updateb已完成并且索引会定期更新。这种查找文件的方法比运行查找并让其沿着树查找要快得多。出于完整性考虑。如果树不是很重,则不反对使用find。


locate "$PWD*.mp4" 只是要提醒的是,你可以跳过grep
Jefferey洞

5

下面的命令有助于搜索任何文件

1)不管情况
2)结果未经许可排除文件夹
3)从根目录或所需路径搜索。用您喜欢的路径更改/。

语法:
find -iname''2>&1 | grep -v“权限被拒绝”

示例

查找/ -iname'C * .xml'2>&1 | grep -v“权限被拒绝”

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
为什么在地球上为什么要使用grep?只需将stderr重定向为nullfind / -iname '*C*.xml' 2>/dev/null
phuclv

3

如果要使用通配符搜索特殊文件,则可以使用以下代码:

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

假设您要从此处搜索每个.conf文件:

.表示从此处开始搜索(当前位置)
-type表示此处为文件(f)的搜索项类型。
-name表示您要搜索带有* .conf名称的文件。


3

这将搜索当前目录和子目录中的所有相关文件,分别或完全计算它们的行数:

find . -name "*.wanted" | xargs wc -l

2

采用

find path/to/dir -name "*.ext1" -o -name "*.ext2"

说明

  1. 第一个参数是您要搜索的目录。
  2. 默认情况下find会递归。
  3. -o代表-or。因此,以上表示搜索此通配符或此通配符。如果只有一种模式,则不需要-o
  4. 通配符模式周围的引号是必需的。
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.