Come cercare i file in modo ricorsivo nelle sottodirectory

90

Sto cercando di cercare tutti i file XML in una directory specifica e tutte le sottodirectory (in modo ricorsivo) al suo interno.

ls -R *.xml elenca solo i file nella directory corrente. Sono sicuro che le sottocartelle stesse hanno diversi .xml di file, ma nessuno di essi mostra.

Si tratta di un problema di configurazione?

    
posta Shamim Hafiz 13.06.2013 - 22:06

4 risposte

68

Prova a utilizzare Trova

sudo find . -print | grep -i '.*[.]xml'
    
risposta data Mitch 13.06.2013 - 22:16
117

Puoi farlo solo con solo :

find . -name '*.xml'

. è la directory corrente. Se devi cercare in un'altra directory, sostituisci . con il percorso della directory.

    
risposta data KaeruCT 13.06.2013 - 22:22
11

Prova questo comando:

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

ls non ha opzioni per filtrare l'output. Per quello avresti bisogno di usare la pipa. Passa l'output da ls a grep , che quindi li filtra per mostrare solo i file .xml .

    
risposta data Rohit Jain 13.06.2013 - 22:10
1

bash

Usando l'opzione di shell globstar , possiamo usare il globbing ricorsivo ./**/*

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 ha un modulo Find , che consente l'attraversamento dell'albero delle directory ricorsivo. All'interno della speciale funzione find() , possiamo definire una subroutine desiderata e la directory che vogliamo attraversare, in questo esempio è . . L'unico elemento di copertina in questo caso sarebbe:

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

Mentre Perl ha un intero modulo dedicato al cross traversal ricorsivo, Python ha una funzione pulita walk() che fa parte di os module, e restituisce ripetutamente tuple del percorso più in alto, lista di tutte le sottodirectory e lista di nomi di file. Possiamo fare quanto segue:

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

Potrebbe essere molto più ordinato come uno 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))
    
risposta data Sergiy Kolodyazhnyy 13.07.2017 - 04:43

Leggi altre domande sui tag