如何将文件递归搜索到子目录中


116

我正在尝试查找XML特定目录中的所有文件以及其中的所有子目录(递归)。

ls -R *.xml仅列出当前目录中的文件。我很确定,子文件夹本身有几个.xml文件,但没有一个出现。

这是配置问题吗?


2
您可以ls -R | grep .xml
Nikos

Answers:


90

尝试使用查找

sudo find . -print | grep -i '.*[.]xml'

4
是必须使用sudo还是为了确保超级用户特权?
Shamim Hafiz 2013年

4
我让你决定。 苏多没有苏多
米奇

6
只是出于兴趣。findover 的优点是ls -R什么?
don.joey 2014年

1
@ don.joey这可能有助于stackoverflow.com/questions/13830036/...
米奇

10
-1用于混合findgrep,当find您需要混合时可以使用正则表达式和glob进行过滤,而不使用find's -print0和grep ' 进行过滤-z
muru 2015年

147

您只能使用find来做到这一点:

find . -name '*.xml'

.是当前目录。如果需要在另一个目录中搜索,请替换.为目录路径。


2
它是否在以当前目录为根的目录中递归搜索所需文件。就我而言,它仅签入当前目录,而不签入子目录。
Mostafiz Rahman 2014年

1
@mostafiz,您需要引用“ * .xml”部分。我将编辑答案。
KaeruCT 2014年

1
实际上,我.php在当前目录中搜索文件。但是它只返回.php当前目录中的文件,而没有在子目录中递归搜索。这就是为什么我要问find命令是否递归搜索。
Mostafiz Rahman 2014年

3
@mostafiz,该find命令以递归方式搜索。如果您不引用该参数,那么我认为您的shell可能会对进行扩展*,因此它将与当前目录中的文件匹配。
2014年

好吧!可能是我犯了一些错误。现在它运行良好!
Mostafiz Rahman 2014年


4

重击

使用globstarshell选项,我们可以利用递归glob./**/*

bash-4.3$ shopt -s globstar
bash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

佩尔

Perl有一个模块Find,该模块允许递归目录树遍历。在特殊find()功能中,我们可以定义所需的子例程和要遍历的目录,在本示例中为.。在这种情况下,单线是:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

蟒蛇

Perl有一个专用于递归树遍历的完整模块,而Python有一个整洁的函数walk(),它是os模块的一部分,并反复返回最上层路径的元组,所有子目录的列表和文件名的列表。我们可以执行以下操作:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

作为脚本,这可能更加整洁:

#!/usr/bin/env python
import os,sys 
for r,s,f in os.walk("."): 
    for i in f: 
        if i.endswith(".xml") 
             print(os.path.join(r,i))

还提到find了递归遍历的其他答案,这是该工作的首选工具。需要提及的是,find有多个命令行开关,例如-printf以所需格式打印输出,-type f仅查找常规文件,-inum按索引节点号-mtime搜索,按修改日期搜索,-exec <command> {} \;执行特定命令以处理文件的事实。使用传递文件作为参数(当前文件的{}标准find占位符在哪里)以及其他许多参数,因此请阅读的联机帮助页find

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.