Как искать рекурсивные файлы в подкаталогах

82

Я пытаюсь искать все XML файлов в определенном каталоге и всех подкаталогах (рекурсивно) внутри него.

ls -R *.xml только перечисляет файлы в текущем каталоге. Я уверен, что в самих подпапках есть несколько файлов .xml , но ни один из них не отображается.

Это проблема конфигурации?

    
задан Shamim Hafiz 13.06.2013 в 22:06
источник

4 ответа

61

Попробуйте использовать Поиск

sudo find . -print | grep -i '.*[.]xml'
    
ответ дан Mitch 13.06.2013 в 22:16
источник
101

Вы можете сделать это только с найти :

find . -name '*.xml'

. - текущий каталог. Если вам нужно выполнить поиск в другом каталоге, замените . на путь к каталогу.

    
ответ дан KaeruCT 13.06.2013 в 22:22
11

Попробуйте выполнить следующую команду:

ls -R | grep '.*[.]xml'

ls не имеет параметров для фильтрации вывода. Для этого вам нужно будет использовать трубу. Это передает результат от ls до grep , который затем фильтрует их, чтобы отображать только файлы .xml .

    
ответ дан Rohit Jain 13.06.2013 в 22:10
0

баш

Используя опцию globstar shell, мы можем использовать рекурсивное globbing ./**/*

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

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

Python

В то время как 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))
    
ответ дан Sergiy Kolodyazhnyy 13.07.2017 в 04:43