提问人:john 提问时间:5/6/2011 最后编辑:hydejohn 更新时间:9/9/2023 访问量:4328784
如何根据通配符匹配以递归方式查找当前文件夹和子文件夹中的所有文件?
How can I recursively find all files in current and subfolders based on wildcard matching?
答:
使用 find
:
find . -name "foo*"
find
需要一个起点,所以 (dot) 指向当前目录。.
评论
find . foo*
foo*
" "
find . -name "foo*" 2>/dev/null
find
将查找与模式匹配的所有文件:
find . -name "*foo"
但是,如果您想要一张图片:
tree -P "*foo"
评论
brew install tree
对于未安装的 Mac OSX 用户apt-get
管道查找进入 grep 通常更方便;它为您提供了用于任意通配符匹配的正则表达式的全部功能。
例如,要查找文件名中不区分大小写的字符串“foo”的所有文件:
find . -print | grep -i foo
评论
find
还具有用于不区分大小写的通配符、正则表达式和不区分大小写的正则表达式匹配的 、 和 标志,因此不需要管道化。-iname
-regex
-iregex
grep
find
grep
如果 shell 支持新的通配选项(可通过以下方式启用):),则可以使用:shopt -s globstar
echo **/*foo*
以递归方式查找任何文件或文件夹。Bash 4、zsh 和类似的 shell 都支持这一点。
就我个人而言,我已经定义了这个 shell 函数:
f() { find . -name "*$1*"; }
注意:上面的行可以直接粘贴到 shell 中,也可以添加到用户的 ~/.bashrc
文件中。
然后,我可以通过键入以下命令来查找任何文件:
f some_name
或者,您可以使用具有简单语法的 fd
实用程序,例如 .fd pattern
评论
shopt -s globstar
bash-3.2$ shopt -s globstar
给bash: shopt: globstar: invalid shell option name
find -L . -name "foo*"
在少数情况下,我需要 -L 参数来处理符号目录链接。默认情况下,符号链接将被忽略。在这些情况下,这很令人困惑,因为我会将目录更改为子目录并查看与模式匹配的文件,但 find 不会返回文件名。使用 -L 可以解决该问题。find 的符号链接选项为 -P -L -H
评论
用
find <directory_path> -type f -name "<wildcard-match>"
在通配符匹配中,您可以提供要匹配的字符串,例如,*.c(对于所有 C 文件)。
评论
-L
: 。不要使用,因为它还将包含符号目录链接。find
-type f
find
find -L <optional_directory_path> -type f
-type f,l
用于文件搜索
find / -xdev -name settings.xml
→整个计算机
→当前目录及其子目录find ./ -xdev -name settings.xml
对于扩展名类型的文件:
find . -type f -name "*.iso"
以递归方式搜索文件的默认方法是,在大多数情况下可用
find . -name "filepattern"
它开始递归遍历您所在位置中的文件名或模式。使用 find 命令,您可以使用通配符和各种开关。若要查看选项的完整列表,请键入
man find
或者,如果手册页在您的系统中不可用:
find --help
但是,还有比 find 更现代、更快的工具,它们遍历整个文件系统并索引文件。一种常见的工具是定位或定位/定位。您应该查看操作系统的手册以了解如何安装它,安装后,它需要启动数据库。如果安装脚本不适合您,可以通过键入
sudo updatedb
并且,要使用它来查找某些特定文件,请键入:
locate filename
或者,要从当前目录中查找文件名或模式,可以键入:
pwd | xargs -n 1 -I {} locate "filepattern"
它将查看其文件数据库,并快速打印出与您键入的模式匹配的路径名。
要查看位置选项的完整列表,请键入:或locate --help
man locate
此外,您可以将 locate 配置为通过 cron 作业在计划时间更新其数据库,因此在凌晨 1 点更新数据库的示例 cron 如下所示:
0 1 * * * updatedb
这些 cron 作业需要由 root 配置,因为 updatedb 需要 root 权限才能遍历整个文件系统。
您可以使用:
find . -type f -name 'text_for_search'
如果要使用正则表达式,请使用:-iname
find . -type f -iname 'text_for_search'
如果要使用通配符搜索特殊文件,可以使用以下代码:
find . -type f -name "*.conf"
假设您想从这里搜索每个 .conf 文件:
.
表示从这里开始的搜索(当前位置)表示此处为文件 (F)
的搜索项类型。
表示您要搜索具有 *.conf 名称的文件。-type
-name
评论
fd
如果速度太慢,请尝试使用该实用程序 - 一种简单快捷的替代方法,可以替代用 Rust 编写。find
fd
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 / -iname '*C*.xml' 2>/dev/null
以下命令将列出当前文件夹及其子文件夹中具有确切名称“pattern”(例如)的所有文件。
find ./ -name "pattern"
评论
这将搜索当前目录和子目录中的所有相关文件,分别计算它们的行数,以及全部计算它们的行数:
find . -name "*.wanted" | xargs wc -l
我很惊讶地发现,当我们要递归时,locate 并没有被大量使用。
我会先做一个定位“$PWD”来获取当前感兴趣的文件夹中的文件列表,然后根据需要对它们运行 greps。
locate "$PWD" | grep -P <pattern>
当然,这是假设 updatedb 已经完成并且索引会定期更新。这是查找文件的方法,比运行查找并要求它下树要快得多。为了完整起见,提到这一点。如果树不是很重,就不反对使用 find。
评论
locate "$PWD*.mp4"
只是为了提醒您,您可以跳过grep
用
find path/to/dir -name "*.ext1" -o -name "*.ext2"
解释
- 第一个参数是要搜索的目录。
- 默认情况下,执行递归。
find
- 代表 .所以上面意味着搜索这个通配符或这个通配符。如果您只有一个模式,则不需要 .
-o
-or
-o
- 通配符模式周围的引号是必需的。
使用 Python>3.5,使用 glob,指向当前文件夹并查找文件:.
.txt
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
对于旧版本的 Python,可以安装 glob2
评论
sed
的问题,其中包含使用 awk
和类似问题的公认答案。[...]感觉这是被追随趋势而不是思考它的人投了反对票。– 但两者都是命令行工具,而 Python 是一种功能齐全的编程语言。否决答案会花费代表,这不鼓励无缘无故地这样做,但如果您仍然认为这是投票欺诈,请阅读这篇文章。P.S.:请使用评论或 Stack Overflow Chat 进行讨论,它们不属于答案。sed
awk
如果已安装,请尝试使用该命令。安装说明。fd
查找所有以“name”开头的文件:
fd "name*"
此命令忽略所有和 ed 文件。.hidden
.gitignore
要包含 ed 文件,请添加如下选项:.gitignore
-I
fd -I "name*"
要包含隐藏文件,请添加以下选项:-H
fd -H "name*"
您也可以使用 ripgrep。
例:
搜索所有文件名包含子字符串 psql,
rg --files | rg psql
评论