Como procurar arquivos recursivamente em subdiretórios

87

Estou tentando procurar todos os arquivos XML em um diretório específico e todos os subdiretórios (recursivamente) dentro dele.

ls -R *.xml está listando apenas arquivos no diretório atual. Tenho certeza de que as subpastas têm vários arquivos .xml , mas nenhum está aparecendo.

Este é um problema de configuração?

    
por Shamim Hafiz 13.06.2013 / 22:06

4 respostas

64

Tente usar Localizar

sudo find . -print | grep -i '.*[.]xml'
    
por Mitch 13.06.2013 / 22:16
110

Você pode fazer isso com somente :

find . -name '*.xml'

. é o diretório atual. Se você precisar procurar em outro diretório, substitua . pelo caminho do diretório.

    
por KaeruCT 13.06.2013 / 22:22
11

Experimente este comando:

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

ls não tem opções para filtrar a saída. Para isso você precisaria usar pipe. Isso passa a saída de ls para grep , que então os filtra para mostrar apenas os arquivos .xml .

    
por Rohit Jain 13.06.2013 / 22:10
1

bash

Usando a opção globstar shell, podemos fazer uso de globalização recursiva ./**/*

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

O Perl tem um módulo Find , que permite a travessia recursiva da árvore de diretórios. Dentro da função especial find() , podemos definir uma sub-rotina desejada e o diretório que queremos percorrer, neste exemplo que é . . O one-liner, nesse caso, seria:

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

Enquanto o Perl tem um módulo inteiro dedicado à travessia de árvore recursiva, o Python possui uma função pura walk() que é parte do os module, e repetidamente retorna tupla do caminho mais alto, lista de todos os subdiretórios e lista de nomes de arquivos. Nós podemos fazer o seguinte:

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

Isso pode ser muito mais simples como um script:

#!/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))
    
por Sergiy Kolodyazhnyy 13.07.2017 / 04:43

Tags