Öznitelikle Alt Dizinlerde Dosyaları Arama


117

XMLBelirli bir dizindeki tüm dosyaları ve içindeki tüm alt dizinleri (tekrarlı olarak) aramaya çalışıyorum .

ls -R *.xmlsadece geçerli dizindeki dosyaları listeliyor. Alt klasörlerin kendilerinde birkaç .xmldosya olduğundan eminim ama hiçbiri görünmüyor.

Bu bir yapılandırma sorunu mu?


2
Yapabilirsinizls -R | grep .xml
Nikos

Yanıtlar:


90

Bul'u kullanmayı deneyin

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

4
sudo şartı mı yoksa süper kullanıcı ayrıcalıkları sağlamak için orada mı?
Shamim Hafiz

4
Karar vermene izin verdim. Sudo , hayır Sudo .
Mitch

6
Sadece ilgi alanı dışında. Avantajı nedir findüzerinde ls -R?
don.joey,

1
@ don.joey Bu yardımcı olabilir stackoverflow.com/questions/13830036/…
Mitch

10
Karıştırma için -1 , hem regex'leri hem de globları kullanarak filtreleme yapabilir findve karıştırmanız grepgerektiğinde 's ve grep'leri findkullanmayacaksınız . find-print0-z
muru,

147

Yalnızca bul ile yapabilirsiniz :

find . -name '*.xml'

.Geçerli dizin. Başka bir dizinde arama yapmanız gerekirse ., dizin yoluyla değiştirin .


2
Geçerli dizinde köklü dizinde istenen dosyayı tekrar tekrar arar mı? Benim durumumda sadece güncel dizine bakın, alt dizini kontrol etmedim.
Mostafiz Rahman

1
@ mostafiz, '* .xml' kısmını alıntı yapmanız gerekiyor. Cevabımı düzenleyeceğim.
KaeruCT

1
Aslında .phpgeçerli dizindeki dosyaları aradım . Ancak yalnızca .phpgeçerli dizindeki dosyaları döndürdü , alt dizinlerde özyinelemeyle aranmadı. Bu yüzden findkomutun tekrarlı arama yapıp yapmadığını soruyorum .
Mostafiz Rahman

3
@ mostafiz, findkomut özyinelemeli olarak arar. Parametreyi alıntılamazsanız, kabuğunuzun üzerinde genişleme yapabileceğini düşünüyorum *, bu nedenle geçerli dizindeki dosyalarla eşleşir.
KaeruCT

Tamam! Belki bir hata yaptım. Şimdi mükemmel çalışıyor!
Mostafiz Rahman,

13

Bu komutu dene:

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

lsçıktıyı filtreleme seçenekleri yok. Bunun için boru kullanmanız gerekir. Bu çıktıyı 'dan' lsya iletir ve grepardından sadece .xmldosyaları gösterecek şekilde filtreler .


5
Herneyse, bunun geldiği dizini göstermesi için mi?
AdamO,


4

darbe

globstarShell seçeneğini kullanarak özyinelemeli globbing'i 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 Findözyinelemeli dizin ağacı geçişi sağlayan bir modül vardır . Özel find()fonksiyon içinde, istenen bir alt yordam ve geçiş yapmak istediğimiz dizini bu örnekte tanımlayabiliriz .. Böyle bir durumda tek gömlek şöyle olur:

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

piton

Perl özyinelemeli ağaç geçişine adanmış bir modüle sahip olsa da Python, modülün bir walk()parçası olan düzenli bir işleve sahiptir osve art arda en üstteki yolun demetini, tüm alt dizinlerin listesini ve dosya adlarının listesini 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 senaryo olarak çok daha iyi 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))

bulmak

findÖzyinelemeli geçiş için diğer cevaplar da belirtilmiştir ve işte işe yarayan araç budur. Belirtilmesi gereken find, -printfçıktıyı istenen biçimde yazdırmak, -type fyalnızca normal dosyaları bulmak, -inuminode numarasıyla -mtimearamak, değişiklik tarihine göre aramak -exec <command> {} \;, dosyayı işlemek için belirli bir komutu çalıştırmak gibi çoklu komut satırı anahtarlarına sahip olmasıdır. argüman olarak dosya geçirerek ile (burada {}standarttır findgeçerli dosya için yer tutucu) ve diğerleri böylece için manpage okuyunuz find.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.