Come cercare ricorsivamente i file nelle sottodirectory


117

Sto cercando di cercare tutti i XMLfile in una directory particolare e tutte le sottodirectory (ricorsivamente) al suo interno.

ls -R *.xmlelenca solo i file nella directory corrente. Sono abbastanza sicuro, le sottocartelle stesse hanno diversi .xmlfile, ma nessuno viene visualizzato.

È un problema di configurazione?


2
Puoi farlols -R | grep .xml
Nikos,

Risposte:


90

Prova a usare Trova

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

4
è necessario sudo o è lì per garantire i privilegi di superutente?
Shamim Hafiz,

4
Ti lascio decidere. Sudo , No Sudo .
Mitch

6
Solo per interesse. Qual è il vantaggio di findover ls -R?
don.joey,

1
@ don.joey Questo potrebbe aiutare stackoverflow.com/questions/13830036/...
Mitch

10
-1 per il missaggio finde grep, quando è findpossibile eseguire il filtraggio utilizzando sia regex che globs, e non usare find's -print0e grep's -zquando è necessario miscelare.
muru,

147

Puoi farlo solo con find :

find . -name '*.xml'

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


2
Cerca ricorsivamente il file richiesto nella directory radicata nella directory corrente. Nel mio caso ha appena verificato solo nella directory corrente, non ha controllato la sottodirectory.
Mostafiz Rahman,

1
@mostafiz, devi citare la parte '* .xml'. Modificherò la mia risposta.
KaeruCT

1
In realtà ho cercato i .phpfile nella directory corrente. Ma ha restituito solo i .phpfile nella directory corrente, non ha cercato ricorsivamente nelle sottodirectory. Ecco perché sto chiedendo se il findcomando cerca in modo ricorsivo o meno.
Mostafiz Rahman,

3
@mostafiz, il findcomando cerca in modo ricorsivo. Se non citate il parametro, penso che la vostra shell potrebbe fare un'espansione su *, quindi corrisponderà ai file nella directory corrente.
KaeruCT

Tutto ok! Forse ho fatto un errore. Ora funziona perfettamente!
Mostafiz Rahman,

13

Prova questo comando:

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

lsnon ha opzioni per filtrare l'output. Per questo dovresti usare pipe. Questo passa l'output da lsa grep, che poi li filtra per mostrare solo i .xmlfile.


5
Comunque per ottenere questo per mostrare la directory da cui proviene?
AdamO,

1
Link obbligatorio: perché non analizzare ls?
Ruslan,

4

bash

Usando l' globstaropzione shell, 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 di alberi di directory ricorsivi. All'interno della find()funzione speciale , possiamo definire una subroutine desiderata e la directory che vogliamo attraversare, in questo esempio .. Il one-liner in tal 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

Pitone

Mentre Perl ha un intero modulo dedicato alla traslazione di alberi ricorsivi, Python ha una funzione ordinata walk()che fa parte del osmodulo e restituisce ripetutamente tupla del percorso più in alto, elenco di tutte le sottodirectory e elenco 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

Questo 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))

trova

Altre risposte sono state menzionate findper l'attraversamento ricorsivo e questo è lo strumento ideale per il lavoro. Ciò che è necessario menzionare è il fatto che findha più opzioni della riga di comando, come -printfstampare l'output nel formato desiderato, -type ftrovare solo file regolari, -inumcercare per numero di inode, -mtimecercare per data di modifica, -exec <command> {} \;eseguire un comando particolare per elaborare il file con il passaggio del file come argomento (dove {}è il findsegnaposto standard per il file corrente) e molti altri, per favore leggi la manpage per find.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.