Dosyaları Yinelemeli Olarak Alt Dizinlerde Arama

Her şeyi aramaya çalışıyorum. XML belirli bir dizindeki dosyalar ve içindeki tüm alt dizinler (yinelemeli olarak).

ls -R *.xml yalnızca geçerli dizindeki dosyaları listeliyor. Eminim, alt klasörlerin kendisinde birkaç tane var .xml dosyalar, ama hiçbiri görünmüyor.

Bu bir yapılandırma sorunu mu?

Bunu şununla yapabilirsin bulmak sadece:

find . -name '*.xml'

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

Kullanmayı deneyin Bulmak

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

Bu komutu deneyin:

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

ls çıktıyı filtrelemek için seçenek yok. Bunun için boru kullanmanız gerekir. Bu, çıktıyı şu adresten geçirir: ls -e doğru grep, daha sonra sadece göstermek için onları filtreler .xml dosyalar.

deneme

Kullanım globstar kabuk seçeneği, özyinelemeli globbing'i kullanabiliriz ./**/*

bash-4.3$ shopt -s globstarbash-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

Perlname

Perl'in bir modülü var Find, özyinelemeli dizin ağacı geçişi sağlar. Özel içinde find() işlev, istenen bir alt yordamı ve geçmek istediğimiz dizini tanımlayabiliriz, bu örnekte .. Böyle bir durumda tek astar şöyle olacaktır:

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ış bütün bir modüle sahipken, Python'un düzgün bir işlevi vardır walk() bu bir parçası os modül ve art arda en üstteki yolun tuple'ını, 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 düzgün olabilir:

#!/usr/bin/env pythonimport os,sys for r,s,f in os.walk("."):     for i in f:         if i.endswith(".xml")              print(os.path.join(r,i))

bulmak

Diğer cevaplar bahsetti find özyinelemeli geçiş için ve bu iş için go-to aracıdır. Bahsetmeye ihtiyaç duyulan şey şu ki find gibi birden çok komut satırı anahtarı vardır -printf çıktıyı istenen formatta yazdırmak için, -type f yalnızca normal dosyaları bulmak için, -inum inode numarasına göre arama yapmak için, -mtime değişiklik tarihine göre arama yapmak için, -exec <command> {} \; dosyayı argüman olarak geçirerek dosyayı işlemek için belirli bir komutu çalıştırmak için ( burada {} bu standarttır find geçerli dosya için yer tutucu) ve diğerleri için lütfen manpage'i okuyun find.

Gnome Filemanager'ın içinde büyüteç simgesine (genellikle sağ üstte) tıklayabilir ve ardından geçerli klasörde arama yapmak için yazmaya başlayabilirsiniz.

Bazı insanlar için (ben) bu komut satırını kullanmaktan çok daha kolaydır.

Ls -R / grep yapabilirsin.xml`