Alt dizinlere nasıl tekrar girilir?

90

Tüm XML dosyalarını belirli bir dizinde ve tüm alt dizinleri (yinelemeli olarak) içinde aramaya çalışıyorum.

ls -R *.xml , yalnızca geçerli dizindeki dosyaları listeliyor. Eminim, alt klasörlerin kendileri .xml dosyalarına sahipler, ancak hiçbiri görünmüyor.

Bu bir yapılandırma sorunu mu?

    
sordu Shamim Hafiz 13.06.2013 22:06

4 cevap

68

Bulmayı kullanmayı deneyin

sudo find . -print | grep -i '.*[.]xml'
    
verilen cevap Mitch 13.06.2013 22:16
118

Bunu yalnızca bulabilirsiniz ile yapabilirsiniz:

find . -name '*.xml'

. geçerli dizindir. Başka bir dizinde arama yapmanız gerekiyorsa . dizin yolu ile değiştirin.

    
verilen cevap KaeruCT 13.06.2013 22:22
11

Bu komutu deneyin:

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

ls , çıkışı filtrelemek için seçeneklere sahip değil. Bunun için boru kullanmanız gerekecek. Bu, çıktıyı ls 'den grep ' ye geçirir, ardından bu dosyaları yalnızca .xml dosyalarını gösterecek şekilde filtreler.

    
verilen cevap Rohit Jain 13.06.2013 22:10
1

bash

globstar kabuk seçeneğini kullanarak, yinelemeli globbing ./**/*

kullanabiliriz
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, yeniden dizinlenmiş dizin ağacı geçişine izin veren Find modülüne sahiptir. Özel find() işlevi içinde, istenen bir altprogramı ve geçiş yapmak istediğimiz dizini tanımlayabiliriz, bu örnekte bu . . Bu durumda tek liner şöyle olurdu:

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, yinelemeli ağaç geçişi için ayrılmış bir tüm modüle sahip olsa da, Python walk() modülünün bir parçası olan os işlevine sahiptir ve en üstteki yolun tuple'ını, tüm alt dizinlerin listesini ve dosya adlarının listesini tekrar tekrar döndürür. Aşağıdakileri yapabiliriz:

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

Bu, bir komut dosyası olarak çok daha net olabilir:

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

Etiketlerdeki diğer soruları oku