如何使用通配符匹配递归查找当前文件夹和子文件夹中的所有文件?

2950

如何使用通配符匹配递归查找当前目录及其子文件夹中的所有文件?

19个回答

4161

使用find命令:

find . -name "foo*"
< p > find 需要一个起始点,所以.(点)指向当前目录。

34
我知道这个标签是Linux,但这值得一提:在其他不是Linux的*nix变体中需要路径。在Linux上,如果您想使用“点”,则路径是可选的。 - IslandCow
6
"foo*"告诉find命令查找所有以"foo"开头的文件。这只是一个例子。您可以使用"gpio*"查找所有名字以gpio开头的文件,或者只使用"gpio1"来查找所有名为gpio1的文件。 - schumacher574
57
请注意,“foo”用引号括起来,这样shell在传递给find命令之前不会展开它。如果您只是输入find . foo*,则“foo”将被展开,然后传递给find命令。 - grinch
79
值得强调的是,对于递归搜索,使用双引号 " " 是非常必要的。 - WesternGun
33
有用的提示:如果您不想收到关于您没有权限或其他错误的目录的通知,您可以执行 find . -name "foo*" 2>/dev/null - Jobbo
显示剩余21条评论

313

find的输出导入grep通常更方便;它为您提供了完整的正则表达式功能,用于任意通配符匹配。

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

find . -print | grep -i foo

109
find 命令还有 -iname-regex-iregex 标志,用于进行不区分大小写的通配符、正则表达式和不区分大小写的正则表达式匹配,因此无需将其输出导向 grep - iobender
9
我认为这并不是关于是否必要,而是更加方便。 - Elijah Lynn
3
然而,使用管道符号 | 连接 grep -v 命令可以让你使用简单的字符串或正则表达式来删除不需要的条目。 - door_number_three
7
很遗憾,我可以根据经验告诉你,并非所有系统都带有支持这些选项的“find”命令。 有时,“grep”成为唯一的选择。 - Mr. Llama
1
这里有一个重要的警告,如果你在包含大量文件(例如 \)的目录上使用 find 命令,那么速度会非常慢。 - alfalfasprout
工作得很好。没想到会得到关于foo的答案,但是得到了这些答案:Fooled AroundFool Would SayFool's OvertureDevil's FoodFoo FightersFoot In The DoorFooling Yourself :) - undefined

216

find 命令会查找所有符合指定模式的文件:

find . -name "*foo"

然而,如果你想要一张图片:

tree -P "*foo"

24
若在Mac OSX上没有安装apt-get,则可使用命令brew install tree进行安装。 - DeBraid
1
在 macOS Sierra 上测试过,只需添加 '--print' -> ' find . name "*foo" --print '。 http://superuser.com/questions/177289/searching-mac-through-terminal - john-salib
3
在CentOS中,执行"sudo yum install tree -y"命令来安装tree软件。 - Santosh Kumar Arjunan

104

fd

如果find太慢了,可以尝试使用fd实用程序 - 这是一个用Rust编写的简单且快速的find替代品。

语法:

fd PATTERN

演示:

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


3
这些表现结果看起来非常有前途。你可以考虑将FD添加到自制软件中... - Gr3go

77
find -L . -name "foo*"
在一些情况下,我需要使用-L参数来处理符号目录链接。默认情况下,符号链接会被忽略。在那些情况下,这会很令人困惑,因为我会切换到子目录,并看到与模式匹配的文件,但是find不会返回文件名。使用-L可以解决这个问题。find命令的符号链接选项包括-P、-L和-H。

6
L 选项非常有帮助。很多时候,用户没有关于底层目录的任何概念,无论它们是软链接还是普通目录。因此,在怀疑的情况下,使用 L 选项总是一个好主意。至少,它一直对我有帮助。 - Ritesh

71

使用

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

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


5
你的答案是这里最正确的,因为它只按照特定的文件类型进行搜索。其他没有指定类型的答案会返回目录。 - wilsotc
1
如果你想搜索一个目录,"-type f" 可以改成 "-type d"。 - XYZ_Linux
默认情况下,find 检测符号文件链接(但不检测符号目录链接)。-type f 会导致 find 不检测符号文件链接。如果您还想包括指向文件的符号链接,请使用 -Lfind -L <可选目录路径> -type f。不要使用 -type f,l,因为它还会包括符号目录链接。 - M Imam Pratama

60

如果你的shell支持一种新的globbing选项(可以通过shopt -s globstar启用),你可以使用:

echo **/*foo*

要递归查找文件或文件夹,此功能在Bash 4、zsh和类似的shell中都支持。


个人定义了以下shell函数:

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

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

然后我可以通过键入以下命令来查找任何文件:

f some_name

或者你可以使用一个带有简单语法的 fd 实用工具,例如 fd pattern


1
这仅进入单个级别,不会对子目录进行递归。 - Broncha
4
因为您需要通过执行“shopt -s globstar”命令来启用扩展的globbing。这在Bash、zsh和类似的shell中都被支持。 - kenorb
bash-3.2$ shopt -s globstar gives bash: shopt: globstar: invalid shell option name - drewish
@drewish 你需要升级你的Bash到4.x版本。 - kenorb

43

使用

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

解释

  1. 第一个参数是您要搜索的目录。
  2. 默认情况下,find 进行递归搜索。
  3. -o 表示 -or。所以上面的意思是搜索此通配符或这个通配符。如果您只有一个模式,则不需要使用 -o
  4. 必须在通配符模式周围加上引号。

19

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

find . -name "filepattern"

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

man find

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

find --help

然而,有比find更现代且更快的工具,这些工具遍历整个文件系统并索引文件。其中一个常见的工具是locate或slocate/mlocate。您应该查看您的操作系统手册以了解如何安装它,并一旦安装完成,需要启动数据库。如果安装脚本没有为您执行此操作,则可以通过输入以下命令来手动执行:

sudo updatedb

而要使用它来查找某个特定文件,输入:

locate filename

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

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

它会查找其文件数据库,并快速打印出与您键入的模式匹配的路径名。要查看locate的所有选项,请键入:locate --helpman locate

此外,您可以通过cron作业配置locate在预定时间更新其数据库,因此一个每天凌晨1点更新数据库的示例cron如下:

0 1 * * * updatedb

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


19

您可以使用:

find . -type f  -name 'text_for_search'

如果你想使用正则表达式,请使用-iname

find . -type f  -iname 'text_for_search'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接