2009-07-06 17 views
27

Bazen bir dosyanın çok derin olmadığını biliyorum, ancak çok yoğun bir alt dizin kolayca istediğim dosyaları bulmama izin vermiyor.Bulabilir veya ilk önce dosyalar için başka bir araç arayabilir?

find (veya başka bir araç), ilk arama özelliğini kullanarak dosyaları arayabilir mi?

+1

Eğer hala böyle bir şey arıyorsanız, ben (https://github.com/tavianator/bfs) –

+0

yazdım Ve ** find ** komutunun "kuru" seçeneğini master sen varsın Nesne - dosya veya dizini bildiğiniz zaman bazı derin köklü, son derece popüle edilmiş bir dizin alt ağacının derinlemesine ilk özyinelemeli arayışında hiçbir anlam ifade etmiyorsunuz. –

cevap

16

Evet, bir çeşit.

Dizinin kendisinden önce bir yöneticinin içeriğini işlemesi için -depth seçeneğini kullanabilirsiniz. Aşağı kaç tane klasörün durulacağını sınırlamak için -maxdepth seçeneğini de kullanabilirsiniz.

+2

"çeşit" haklı - a/b/c a/d'den önce ziyaret edileceğinden, bu gerçekten de bir ilk geniş kapsamlı arama değil. Yine de çoğu amaç için yeterince iyi. – ephemient

+1

Bu hala ilk arama değil. Bu sadece sınırlı derinlikte ilk arama.Sınırlı derinlikteki ilk arama, "bir dosya [yani] çok da derin değil" bulma problemini çözüyor, ancak yine de bu kesinlikle ilk arama değil. – yiati

4

--maxdepth seçeneği ile find kullanın.

Referans sayfanızdaki Directories bölümündedir; ihtiyaçlarınıza bağlı olarak diğer seçenekleri daha uygun bulabilir.

İlk aramada tam genişliğe ulaşmak için, karışık --mindepth ve --maxdepth seçenekleriyle döngü yapmanız gerekir. Ancak, bunun tam olarak gerekli olduğunu düşünmüyorum, derinlemesine sınırlı bir arama genellikle yeterli olacaktır.

7

Korkunç kesmek,

#!/bin/bash 
i=0 
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do 
    echo "$results" 
    ((i++)) 
done 

Temelde bu sadece

find -mindepth 0 -maxdepth 0 
find -mindepth 1 -maxdepth 1 
find -mindepth 2 -maxdepth 2 
………………………………………………………………………… 

find kadar döner olmayan sıfır çalıştırır ... -0 veya -print, verimsiz, vb vb dışında herhangi eylemlerle çalışmaz durumu veya hiçbir şey yazdırmaz.

+3

Görünüşe göre [yinelemeli derinlik-ilk arama] (http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search) bana ... –

+1

@MattLuongo: Bağlantınızdan: "IDDFS, birinci sınıf aramaya eşdeğerdir, ama çok daha az bellek kullanır; " –

+1

@MooingDuck Bunun işe yaradığına katılmıyorum, sadece belli bir isme sahip olduğuna işaret ediyor. IDFS, BFS'den daha yavaştır, çünkü her seferinde ağacın önceki seviyesini yeniden geçmeyi gerektirir. Duyduğum argüman, çoğu arama probleminde, çalışma zamanı maliyetinin 'n + 1 'geçişinin maliyetine hükmetmesidir, bu yüzden çoğu zaman değerlidir. –

5

Genişlik, ilk olarak, değişken olarak kuyruğunu kullanarak bulunur.

Çalıştırılabilir yapın bfs.sh

#!/bin/bash 

queue="$1" 
shift 

while [ -n "$queue" ] 
do 
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $* 
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d` 
done 

oluşturun:

$ chmod u+x ./bfs.sh

Sonra bir yapabilirsiniz genişliğini ilk bulabilirsiniz ölçütü:

$ ./bfs.sh /path/to/somewhere -name foobar

0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n | awk '{print $2}' | xargs grep -d skip "search term" 

Tüm dosyaları listelemek için bul'u kullanır. İlk awk komutu tüm '/' karakterlerini sayar. Sayımı sıralar ve sayım sütununu bırakır. Sonunda, dosyaların sıralı listesini grep için xargs kullanır.

Gerçekten çirkin.

İlgili konular