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


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


1210
2018-05-05 23:01


起源


@kenorb - 哇,谢谢!它适用于ubuntu,但不适用于QNAP QTS。 - j.c


答案:


使用  为了那个原因:

find . -name "foo*"

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


1798
2018-05-05 23:03



find 需要一个起点,而。(点)是选择当前目录。例如。如果你在/ home / myuser, find /home/myuser 和 find . 有相同的结果。 - Donal Lafferty
我知道这被标记为linux但是值得一提的是:在其他不是linux的* nix变种上需要路径。在linux上,如果要使用点,则路径是可选的。 - IslandCow
@Seatter“foo *”告诉find查找以“foo”开头的所有文件。这只是他的榜样。您可以使用“gpio *”查找名称以gpio开头的所有文件,或只使用“gpio1”查找名为gpio1的所有文件。 - schumacher574
请注意,“foo *”在引号中,因此shell在将其传递给find之前不会展开它。如果你刚刚做到了 find . foo*, foo* 将被扩展然后传递给找到。 - grinch
值得强调的是 " " 是递归搜索非常必要的。 - WesternGun


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

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

~$ find . -print | grep -i foo

164
2017-08-15 06:56



find 也有 -iname, -regex,和 -iregex 不区分大小写的通配符,正则表达式和不区分大小写的正则表达式匹配的标志,因此管道到 grep 是不必要的。 - iobender
我不认为这是不必要的,但更方便。 - Elijah Lynn
但是,管道到grep -v可以允许您使用简单的字符串或正则表达式来删除您不想要的条目。 - door_number_three
@iobender - 可悲的是,我可以从经验告诉你,并非所有的系统都带有 find 支持这些选项的命令。有时 grep 成为唯一的选择。 - Mr. Llama


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

find . -name "*foo"

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

tree -P "*foo"

希望这可以帮助!


105
2018-05-05 23:15



brew install tree 对于Mac OSX用户没有 apt-get 安装 - DeBraid
在macOS Sierra上测试,只需添加'--print' - >'find。名称“* foo”--print'。 superuser.com/questions/177289/searching-mac-through-terminal - john-salib


find -L . -name "foo*"

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


16
2018-01-14 02:47



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


如果你支持shell 一个新的全球选项 (启用它: shopt -s globstar), 您可以使用:

echo **/*foo*

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


我个人已经定义了这个shell函数:

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

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

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

f some_name

虽然它与使用几乎相同 fd 效用


16
2018-01-13 16:23



这只是一个单一的层次。不会为我递归到子目录 - Broncha
@Broncha因为你需要激活扩展的globbing shopt -s globstar 命令。 Bash,zsh和类似shell支持此功能。 - kenorb
bash-3.2$ shopt -s globstar 给 bash: shopt: globstar: invalid shell option name - drewish
@drewish您需要将Bash升级到4.x. - kenorb
回声 * / * FOO 比查找快 - Josef Klimuk


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

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


15
2018-02-05 13:32



您的答案是第一个最正确的,因为它只搜索指定的文件。其他未指定类型的人将返回目录。 - wilsotc


您可以使用:

# find . -type f  -name 'text_for_search'

如果你想使用REGX -iname

# find . -type f  -iname 'text_for_search'

6
2017-10-29 16:09





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

find . -name "filepattern"

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

man find

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

find --help

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

sudo updatedb

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

locate filename

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

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

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

另外,您可以配置locate以通过cron作业在预定时间更新它的数据库,因此在1AM更新db的示例cron看起来像:

0 1 * * * updatedb

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


4
2017-08-09 06:27



因为它是唯一一个提到xargs的人 - drewish


用于文件搜索
find / -xdev -name settings.xml    - >整台电脑
find ./ -xdev -name settings.xml   - >当前目录及其子目录

对于具有扩展类型的文件

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

2
2018-05-31 08:47





fd

以防万一, find 太慢了,试试吧 fd 实用程序 - 一种简单而快速的替代方案 find 写在Rust。

句法:

fd PATTERN

演示:

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


1
2018-06-13 15:22