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

john 1695 linux shell

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

tux21b.. 2477

使用find:

find . -name "foo*"

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

  • `find`需要一个起点,而.(dot)正在选择当前目录.例如,如果你在/ home/myuser中,`find/home/myuser`和`find .`有相同的结果. (66认同)
  • 请注意,"foo*"在引号中,因此shell在将其传递给find之前不会展开它.如果你只是'找到了.foo*`,`foo*`将被扩展然后传递给find. (22认同)
  • 值得强调的是,""对于递归搜索非常必要. (21认同)
  • 我知道这被标记为linux但是值得一提的是:在其他不是linux的*nix变种上需要路径.在linux上,如果要使用点,则路径是可选的. (20认同)
  • @Seatter"foo*"告诉find查找以"foo"开头的所有文件.这只是他的榜样.您可以使用"gpio*"查找名称以gpio开头的所有文件,或只使用"gpio1"查找名为gpio1的所有文件. (4认同)
  • 也很有用:如果您不想被通知您没有权限(或其他错误)的目录,可以执行`find。-name“ foo *” 2> / dev / null` (2认同)

Paul Whipp.. 205

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

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

~$ find . -print | grep -i foo

  • `find`还具有`-iname`,`-regex`和`-iregex`标志,用于不区分大小写的通配符,正则表达式和不区分大小写的正则表达式匹配,因此不需要使用`grep`. (50认同)
  • 我不认为这是不必要的,但更方便. (5认同)
  • @iobender-很遗憾,我可以从经验中告诉您,并非所有系统都带有支持这些选项的`find`命令。有时,`grep`成为唯一的选择。 (2认同)

IslandCow.. 137

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

find . -name "*foo"

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

tree -P "*foo"

希望这可以帮助!

  • 没有安装"apt-get"的Mac OSX用户的"brew install tr​​ee" (14认同)

小智.. 30

find -L . -name "foo*"

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


kenorb.. 26

如果您的shell支持新的globbing选项(可以通过以下方式启用shopt -s globstar),您可以使用:

echo **/*foo*

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


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

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

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

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

f some_name

或者,您可以使用具有简单语法的fd实用程序,例如fd pattern.

  • @Broncha因为你需要通过`shopt -s globstar`命令激活扩展的globbing.Bash,zsh和类似shell支持此功能. (3认同)

XYZ_Linux.. 25

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

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


kenorb.. 21

fd

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

句法:

fd PATTERN

演示:

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

  • 我第一次在近9年里看到了一个关于SO的GIF.不错的工作! (11认同)
  • @aprodan演示图像是从GitHub复制的,但是我相信他们正在使用[`asciinema`](https://asciinema.org/),然后转换为GIF格式,但是我不确定。 (2认同)

小智.. 10

您可以使用:

# find . -type f  -name 'text_for_search'

如果你想使用REGX使用 -iname

# find . -type f  -iname 'text_for_search'


Aleksandar P.. 7

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

find . -name "filepattern"

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

man find

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

find --help

但是,还有更多更现代,更快捷的工具可以遍历整个文件系统并为文件建立索引,其中一种常见工具是定位或定位/定位,您应该查看操作系统手册以了解如何安装它,安装后需要启动数据库,如果安装脚本不帮您完成,可以通过键入以下内容手动完成

sudo updatedb

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

locate filename

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

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

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

另外,您可以配置locate通过cron作业按计划的时间更新它的数据库,因此示例cron在1AM更新数据库的示例如下所示:

0 1 * * * updatedb

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


Alberto.. 5

用于文件搜索
find / -xdev -name settings.xml ->整个计算机
find ./ -xdev -name settings.xml ->当前目录及其子目录,

用于扩展名类型的文件

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


anshul.. 5

Following command will list down all the files having exact name "pattern" (for example) in current and its sub folders.

find ./ -name "pattern"