ChatGPT解决这个技术问题 Extra ChatGPT

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

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


M
Mateen Ulhaq

使用 find

find . -name "foo*"

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


我知道这被标记为 linux,但值得一提的是:在非 linux 的其他 *nix 变体上,该路径是必需的。在 linux 上,如果你想使用点,路径是可选的。
@Seatter "foo*" 告诉 find 查找所有以 "foo" 开头的文件。这只是他的榜样。您可以使用“gpio*”来查找名称以 gpio 开头的所有文件,或者只使用“gpio1”来查找所有名为 gpio1 的文件。
请注意,“foo*”在引号中,因此 shell 在将其传递给 find 之前不会对其进行扩展。如果您刚刚执行了 find . foo*,则 foo* 将被扩展,然后传递给 find。
值得强调的是," " 对于递归搜索是非常必要的。
也很有用:如果您不想收到有关您无权访问的目录(或其他错误)的通知,您可以执行 find . -name "foo*" 2>/dev/null
A
Andy Lester

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

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

~$ find . -print | grep -i foo

find 还具有用于不区分大小写的通配符、正则表达式和不区分大小写的正则表达式匹配的 -iname-regex-iregex 标志,因此无需通过管道连接到 grep
我不认为这是不必要的,而是更方便。
但是,通过管道 grep -v 可以让您使用简单的字符串或正则表达式来删除您不想要的条目。
@iobender - 遗憾的是,我可以根据经验告诉您,并非所有系统都带有支持这些选项的 find 命令。有时 grep 成为唯一的选择。
这里的一个重要警告是,如果您在包含大量文件的目录上使用 find(例如;``),那么这可能会很慢。
t
the Tin Man

find 将查找与某个模式匹配的所有文件:

find . -name "*foo"

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

tree -P "*foo"

希望这可以帮助!


brew install tree 适用于未安装 apt-get 的 Mac OSX 用户
在 macOS Sierra 上测试,只需添加 '--print' -> ' 寻找 。名称 "*foo" --print ' 。 superuser.com/questions/177289/searching-mac-through-terminal
sudo yum install tree -y for CentOS
k
kenorb

fd

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

句法:

fd PATTERN

演示:

https://github.com/sharkdp/fd/raw/master/doc/screencast.svg?sanitize=true

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


近 9 年来我第一次看到关于 SO 的 gif。不错的工作!
这些性能结果看起来非常有希望。您可以考虑将 fd 添加到 home-brew ...
题外话:您使用什么工具为演示创建 svg 文件?
@aprodan 演示图像是从 GitHub 复制的,但我相信他们使用的是 asciinema,然后转换为 GIF 格式,但我不确定。
实际上它是 SVG 格式,所以可能 asciicast2vector 可以使用。
t
toddcscar
find -L . -name "foo*"

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


L 开关非常有用。很多时候用户对底层目录一无所知,无论它们是软链接还是普通目录。因此,如有疑问,使用 L 选项总是好的。至少,它一直对我有帮助。
这就是我的答案。谢谢!
k
kenorb

如果您的 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


这只是一个层次。不为我递归到子目录
@Broncha 因为您需要通过 shopt -s globstar 命令激活扩展的通配符。这在 Bash、zsh 和类似的 shell 中得到支持。
bash-3.2$ shopt -s globstar 给出 bash: shopt: globstar: invalid shell option name
@drewish 您需要将 Bash 升级到 4.x
S
Shital Shah

利用

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

解释

第一个参数是要搜索的目录。默认情况下 find 进行递归。 -o 代表 - 或。所以上面的意思是搜索这个通配符或这个。如果您只有一种模式,则不需要 -o。通配符模式周围的引号是必需的。


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

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


您的答案在这里是第一个最正确的,因为它只搜索指定的文件。其他未指定类型的将返回目录。
如果您想搜索目录“-type f”可以更改为“-type d”
默认情况下,find 检测符号 file 链接(但不检测符号 directory 链接中的链接)。 -type f 将导致 find 检测不到符号 file 链接。如果您还想包含指向文件的符号链接,请使用 -L: find -L <optional_directory_path> -type f。不要使用 -type f,l,因为它还会包含符号 目录 链接。
B
Benjamin W.

您可以使用:

# find . -type f  -name 'text_for_search'

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

# find . -type f  -iname 'text_for_search'

A
Alberto

用于文件搜索
find / -xdev -name settings.xml -->整台计算机
find ./ -xdev -name settings.xml -->当前目录 &它的子目录

用于文件扩展类型

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

m
melchi

我很惊讶地发现,当我们要递归时,locate 并没有被大量使用。

我会先定位“$PWD”以获取当前感兴趣的文件夹中的文件列表,然后随意对它们运行 greps。

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

当然,这是假设 updatedb 已经完成并且索引会定期更新。这种查找文件的方法比运行查找并要求它沿树向下查找要快得多。为了完整起见,提到这一点。如果树不是很重,没有什么反对使用 find 的。


locate "$PWD*.mp4" 只是提醒您可以跳过 grep
A
Aleksandar Pavić

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

find . -name "filepattern"

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

man find

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

find --help

然而,有更多现代和更快的工具然后找到,它们遍历你的整个文件系统并索引你的文件,一个这样的常用工具是定位或 slocate/mlocate,你应该查看你的操作系统手册以了解如何安装它,一旦它安装它需要启动数据库,如果安装脚本不为你做,可以通过键入手动完成

sudo updatedb

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

locate filename

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

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

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

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

0 1 * * * updatedb

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


A
Anshul Singhal

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

find ./ -name "pattern"


否决票。这重复了 2017 answer
@Brian 新答案预计会提供一些新信息或替代解决方案,重复已经说过的话是没有用的。与 when asking a question 一样,在编写答案之前,您应该先进行搜索,以确保您的答案会添加一些有用的东西。尤其是当有很多其他答案时,因为在这种情况下,这种可能性接近 0。一点也不难,只需一个 Ctrl+F 即可。
是的,你是对的。我现在同意我考虑得更多。
S
Saman Bayat

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

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

假设,您想从这里搜索每个 .conf 文件:

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


否决票。这些应该是 2011 accepted answer 下的评论或编辑。
M
MukeshKoshyM

下面的命令有助于搜索任何文件 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"

你到底为什么要使用grep呢?只需将 stderr 重定向到 null find / -iname '*C*.xml' 2>/dev/null
J
Jay Yang

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

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

R
Robert Ranjan

如果已安装,请尝试使用 fd 命令。 Install instruction

查找所有以“名称”开头的文件

fd "name*"

此命令忽略所有 .hidden.gitignore ed 文件。

要包含 .gitignoreed 文件,请添加 -I 选项,如下所示

fd -I "name*"

要包含隐藏文件,请添加 -H 选项,如下所示

fd -H "name*"

E
E_net4 - Mr Downvoter

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

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

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


有人可以解释否决票吗?如果我的回答有问题,我想知道它是什么。 – 这个问题询问 Linux shell 的本机解决方案,您用 Python 提供答案。所以你的答案在这里是题外话。
我不明白您的部分评论@EvgenKo423,因为这个答案是由卡图而不是您回答的。
@ValerioBozz 看看 revision history。我引用了他们的问题并回答了。
我已经看到很多关于 sed 的问题以及使用 awk 和类似内容的公认答案。 ...编程语言。否决答案会花费代表,这不鼓励无缘无故这样做,但如果您仍然认为这是投票欺诈,请阅读 this post。 PS:请使用评论或Stack Overflow Chat进行讨论,它们不属于答案。