如何基于通配符匹配以递归方式查找当前和子文件夹中的所有文件?

时间:2011-05-05 23:01:35

标签: linux shell

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

17 个答案:

答案 0 :(得分:2224)

使用find

find . -name "foo*"

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

答案 1 :(得分:192)

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

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

~$ find . -print | grep -i foo

答案 2 :(得分:124)

find将找到与模式匹配的所有文件:

find . -name "*foo"

但是,如果你想要一张照片:

tree -P "*foo"

希望这有帮助!

答案 3 :(得分:23)

如果您的shell支持a new globbing option(可以通过:shopt -s globstar启用),则可以使用:

echo **/*foo*

以递归方式查找任何文件或文件夹。这由Bash 4,zsh和类似的shell支持。

就个人而言,我已经定义了这个shell函数:

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

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

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

f some_name

或者,您可以使用简单的语法fd utility,例如fd pattern

答案 4 :(得分:23)

find -L . -name "foo*"

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

答案 5 :(得分:22)

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

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

答案 6 :(得分:18)

fd

如果find太慢,请尝试fd实用程序 - 这是用Rust编写的find的简单快速替代方法。

语法:

fd PATTERN

演示:

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

答案 7 :(得分:9)

您可以使用:

# find . -type f  -name 'text_for_search'

如果您想使用REGX,请使用-iname

# find . -type f  -iname 'text_for_search'

答案 8 :(得分:6)

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

find . -name "filepattern"

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

man find

或者您的系统中没有手册页

find --help

但是,有更多现代和更快的工具,它们遍历整个文件系统并索引文件,一个常见的工具是定位或slocate / mlocate,你应该检查你的操作系统手册如何安装,一旦安装它就需要启动数据库,如果安装脚本没有为你做,可以通过输入

手动完成
sudo updatedb

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

locate filename

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

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

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

此外,您可以配置locate以通过cron作业在预定时间更新它的数据库,因此在凌晨1点更新db的示例cron将如下所示:

0 1 * * * updatedb

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

答案 9 :(得分:5)

使用

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

说明

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

答案 10 :(得分:4)

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

find ./ -name "pattern"

答案 11 :(得分:3)

用于文件搜索
find / -xdev -name settings.xml - &gt;整台电脑
find ./ -xdev -name settings.xml - &gt;当前目录&amp;它的子目录

对于扩展类型为

的文件
find . -type f -name "*.iso"

答案 12 :(得分:3)

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

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

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

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

答案 13 :(得分:2)

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

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

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

示例

  

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

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

答案 14 :(得分:1)

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

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

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

.表示从这里开始搜索(当前地点)
-type表示搜索项的类型,此处为文件(f) -name表示您要使用 * .conf 名称搜索文件。

答案 15 :(得分:1)

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

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

答案 16 :(得分:-1)

使用 Python>3.5,使用 glob. 指向您的当前文件夹并查找 .txt 文件:

 python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"

对于旧版本的 Python,您可以安装 glob2