如何根据通配符匹配递归查找当前和子文件夹中的所有文件?
使用#0:
find . -name "foo*"
find需要一个起点,所以.(点)指向当前目录。
find
.
find将查找与模式匹配的所有文件:
find . -name "*foo"
如果你想要一张照片:
tree -P "*foo"
管道查找到grep通常更方便;它为您提供了正则表达式的全部功能,用于任意通配符匹配。
例如,要查找文件名中不区分大小写的字符串“foo”的所有文件:
find . -print | grep -i foo
如果您的shell支持一个新的全球化选项(可以通过:shopt -s globstar启用),您可以使用:
shopt -s globstar
echo **/*foo*
递归查找任何文件或文件夹。Bash 4、zsh和类似的shell支持这一点。
我自己定义了这个shell函数:
f() { find . -name "*$1*"; }
注意:上述行可以直接粘贴到shell或添加到用户的~/.bashrc文件中。
~/.bashrc
然后我可以通过键入来查找任何文件:
f some_name
或者,您可以使用#0实用程序和简单的语法,例如fd pattern。
fd pattern
find -L . -name "foo*"
在某些情况下,我需要-L参数来处理符号目录链接。默认情况下,符号链接会被忽略。在这种情况下,这很混乱,因为我将目录更改为子目录并查看与模式匹配的文件,但查找不会返回文件名。使用-L解决了这个问题。查找的符号链接选项是-P-L-H
使用
find <directory_path> -type f -name "<wildcard-match>"
在通配符匹配中,您可以提供您希望匹配的字符串,例如*. c(适用于所有C文件)。
用于文件搜索
find / -xdev -name settings.xml→整个计算机find ./ -xdev -name settings.xml→当前目录及其子目录
find / -xdev -name settings.xml
find ./ -xdev -name settings.xml
对于扩展名类型的文件:
find . -type f -name "*.iso"
递归搜索文件的默认方法,在大多数情况下可用
find . -name "filepattern"
它开始从您所在的当前目录中递归遍历文件名或模式。使用找到命令,您可以使用通配符和各种开关。要查看选项的完整列表,请键入
man find
或者,如果手册页在您的系统中不可用:
find --help
但是,还有比找到更现代,更快的工具,它们正在遍历您的整个文件系统并为您的文件编制索引。一个这样的常见工具是定位或s的/m的。您应该检查操作系统的手册,了解如何安装它,一旦安装,它需要启动数据库。如果安装脚本不能为您完成,可以通过键入以下命令手动完成
sudo updatedb
并且,要使用它来查找某个特定文件,请键入:
locate filename
或者,要从当前目录中查找文件名或模式,您可以键入:
pwd | xargs -n 1 -I {} locate "filepattern"
它将查看其文件数据库并快速打印出与您输入的模式匹配的路径名。要查看定位选项的完整列表,请键入:locate --help或man locate
locate --help
man locate
此外,您可以配置定位以通过cron作业在计划时间更新其数据库,因此在凌晨1点更新数据库的示例cron如下所示:
0 1 * * * updatedb
这些cron作业需要由root配置,因为更新b需要root权限来遍历整个文件系统。
您可以使用:
find . -type f -name 'text_for_search'
如果你想使用正则表达式,请使用-iname:
-iname
find . -type f -iname 'text_for_search'
如果要使用通配符搜索特殊文件,可以使用以下代码:
find . -type f -name "*.conf"
假设,您想从这里搜索每个. conf文件:
.表示从这里(当前位置)开始搜索-type表示搜索项的类型,这里是file(f)。-name表示您要搜索名称为*. conf的文件。
-type
-name
fd
如果find太慢,请尝试fd实用程序-Rust中编写的find的简单快速替代方案。
语法:
fd PATTERN
演示:
首页:https://github.com/sharkdp/fd
下面的命令有助于搜索任何文件
find <FromDirectory> -iname '<FileName wild char allowed>' 2>&1 | grep -v "Permission denied"
示例
find / -iname 'C*.xml' 2>&1 | grep -v "Permission denied"
以下命令将列出当前及其子文件夹中具有确切名称“模式”(例如)的所有文件。
find ./ -name "pattern"
这将搜索当前和子目录中的所有相关文件,分别计算它们的行数以及全部:
find . -name "*.wanted" | xargs wc -l
我很惊讶地看到,当我们要递归时,定位并没有大量使用。
我将首先定位“$PWD”以获取当前感兴趣文件夹中的文件列表,然后根据需要对它们运行greps。
locate "$PWD" | grep -P <pattern>
当然,这是假设updatedb已经完成并且索引定期更新。这比运行查找并要求它沿着树向下移动要快得多。为了完整性而提到这一点。如果树不是很重,则不反对使用查找。
find path/to/dir -name "*.ext1" -o -name "*.ext2"
补充说明
-o
-or
使用Python>3.5,使用球状、.指向当前文件夹并查找.txt文件:
.txt
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
对于旧版本的Python,您可以安装Glob2
如果已安装,请尝试使用fd命令。安装说明。
查找所有以“name”开头的文件:
fd "name*"
此命令忽略所有.hidden和.gitignoreed文件。
.hidden
.gitignore
要包含.gitignoreed文件,请添加-I选项,如下所示:
-I
fd -I "name*"
要包含隐藏文件,请添加-H选项,如下所示:
-H
fd -H "name*"
您也可以使用Ripgrep。
示例:
搜索包含子字符串psql的所有文件名,
rg --files | rg psql