我正在尝试查找XML
特定目录中的所有文件以及其中的所有子目录(递归)。
ls -R *.xml
仅列出当前目录中的文件。我很确定,子文件夹本身有几个.xml
文件,但没有一个出现。
这是配置问题吗?
我正在尝试查找XML
特定目录中的所有文件以及其中的所有子目录(递归)。
ls -R *.xml
仅列出当前目录中的文件。我很确定,子文件夹本身有几个.xml
文件,但没有一个出现。
这是配置问题吗?
Answers:
尝试使用查找
sudo find . -print | grep -i '.*[.]xml'
find
over 的优点是ls -R
什么?
find
和grep
,当find
您需要混合时可以使用正则表达式和glob进行过滤,而不使用find
's -print0
和grep ' 进行过滤-z
。
.php
在当前目录中搜索文件。但是它只返回.php
当前目录中的文件,而没有在子目录中递归搜索。这就是为什么我要问find
命令是否递归搜索。
find
命令以递归方式搜索。如果您不引用该参数,那么我认为您的shell可能会对进行扩展*
,因此它将与当前目录中的文件匹配。
试试这个命令:
ls -R | grep '.*[.]xml'
ls
没有用于过滤输出的选项。为此,您将需要使用管道。这会将输出从传递ls
到grep
,然后过滤它们以仅显示.xml
文件。
使用globstar
shell选项,我们可以利用递归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
。
ls -R | grep .xml