isimlerinin sadece bir kısmını arayarak dosyaları bulmak için komut?


32

Diyelim ki isimleri olan dosyalar var:

batman.c
debate.c
cricketbat.c

Hangi komutu ve tüm bu dosyaları arama etiketini kullanarak listelemek için nasıl kullanmalıyım bat?


5
Eşleşen dosyaları yalnızca geçerli dizinde listelemek ister misiniz? Geçerli dizindeki veya altındaki herhangi bir dizinde? sistemin herhangi bir yerinde?
steeldriver

Yanıtlar:


47

batHer Yerdeki Dosyaları Bulma

İçinde /path/to/folderadlarının bulunduğu her yerde tüm dosyaları bulmak için şunları batkullanabilirsiniz:

find /path/to/folder -name '*bat*'

Ben var alıntılanan arama deseni *bat*tırnak ihmal ve dosyalar maç olsaydı, çünkü *bat*geçerli dizinde, kabuk genişleyecektir *bat*bunlardan bir liste halinde ve geçmesi olduğunu için find. O findzaman doğru çalışmaz. (\*bat\* ve "*bat*"ayrıca çalışır.)

Şu anda bulunduğunuz klasörde arama yapmak için (örneğin cd, kullandığınız), .her zamanki gibi kullanın :

find . -name '*bat*'

Tüm bilgisayarınızı aramak için kullanın/ . Ana dizininizde arama yapmak için kullanın ~veya ana dizininizin tam adını kullanın . ( Kabuk~ , ev müdürünüzün tam nitelikli yoluna genişler .)

İsminize Göre, Aramanızı Genişletme veya Daraltma

Dosyaların içeren bu yüzden, küçük harf duyarsız aramak istiyorsanız BAT, bAteşleştirilen benzeri ve kullanımı -inameyerine testini -nametesti:

find /path/to/folder -iname '*bat*'

Tüm dosyalarınızın bittiğini fark ettim .c. Yalnızca böyle dosyaları bulmak istiyorsanız, şunu kullanın:

find /path/to/folder -name '*bat*.c'

Tüm dosya adlarınızın son ekin batbaşında ya da en sonunda olduğunu fark ettim .c. Gibi dosyaları eşleştirmek önlemek embattled.cistiyorsanız, kullanabilirsiniz:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oolduğu ya da operatör.

Yalnızca Dosyaları Eşleştirme

Yalnızca düzenli dosyaları bulmak - klasörleri, sembolik bağları ve özel aygıt düğümlerini bulmak için - kullanabilirsiniz -type f. Bu, sık sık tavsiye edilir ve bazen oldukça uygundur ... ancak çoğu zaman gerçekten istediğinizi değil , özellikle findçıktıyı kendiniz incelemek amacıyla çalışıyorsanız . Eğer olsaydı sembolik bir bağlantı , Aramanızla eşleşen bu konuda bilmek istemez ki?

Hem normal dosyaları hem de sembolik bağlantıları bulmak istiyorsanız, şunları kullanabilirsiniz:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Bu, -oişleci ve ayrıca gruplama için parantezleri kullanır (bu, kabuğun özel olarak işlem görmemesi için alıntılanması gerekir; aksi halde sözdizimi hatası alırsınız).

Ancak, yalnızca nihayetinde normal bir dosyaya işaret eden sembolik linkleri görmek istediğinizi varsayalım (ve dizinlere, cihaz düğümlerine, vb. Sembolik linkleri değil). Bu aslında daha da basit: -xtypeyerine kullanın -type. Eğer Kaçmıyoruz şartıyla findbirlikte -L, bayrak -xtypesembolik linke bağlantı noktaları için dosyanın türünü test eder.

find /path/to/folder -name '*bat*' -xtype f

Bir dosyaya başka bir bağlantıya bir bağlantı bağlantınız varsa -xtype f, doğrudan hedefi normal bir dosyadan ziyade başka bir bağlantıya sahip olmasına rağmen eşleşecektir . Bu neredeyse her zaman istediğin şey.

Genellikle insanlar istediklerini düşünür -type f, ama gerçekten isterler -xtype f.

Detaylı Çıktı Almak

findbelirtmezseniz varsayılan eylemdir -print. Yukarıda verilen tüm komutlar -printsonunda tacked ile kendilerine eşdeğerdir .

findBulunan dosyalara dayanarak komut çalıştırmak için kullanılır - genellikle değişiklik yapan komutları kullanır. Ancak, amacı sonuçları görüntülemek olan başka eylemler de var -print. Özel ilgi alanı -ls:

find /path/to/folder -name '*bat*' -ls

Bu, her bir dosya hakkında, çok sütunlu bir biçimde, çalıştırarak göreceklerinize benzer (ancak aynı olmasa da) benzer ayrıntılı bilgiler verir .ls file

Daha fazla okuma

findDosya bulmayla ilgili diğer yollar ve diğer yollar için, bkz:


1
Büyük cevap, özellikle -xtypetavsiye; belki ls *bat*ve -maxdepth/ mindepthayrıca bahsetmeye değer.
mklement0

2
@ mklement0 Teşekkürler! OP, dosyaların nerede olduğu ve özyinelemenin gerekli olup olmadığı konusunda henüz açıklama yapmamıştır. As Chaos'in cevabı kaplı lszaten, ben ile özyinelemeli durumda odaklanmış findburada. Tabii ki, ayrıntılı bir cevap bazı desen eşleştirme dosya adlarını -Yinelemeli liste dışı kapsayan (veya daha az) ( lsve findile -maxdepth) de yararlı olacaktır. Böyle bir cevap göndermek isteyebilirsiniz!
Eliah Kagan,

16

En kolay yol kaçmaktır.

locate bat

Bu yolla, dosya adında "yarasa" içeren dosyalar için tüm bilgisayarda arama yapabilirsiniz.

PC'nizdeki dosyaların listesini yenilemek için

updatedb

Son zamanlarda hesabınıza yeni dosyalar eklediğinizde bu komutu çalıştırın


1
ihtiyaçlarupdatetdb
Sergiy Kolodyazhnyy

4
@Serg Yeni dosyalar bulmak için (en son manuelden updatedbveya otomatik olarak son çalıştırılandan daha yeni), sudo updatedbönce çalıştırılması gerekir, evet.
Eliah Kagan

Bunun ismin eşleşmesi için tüm sistemi arayacağına dikkat edin bat.
terdon

1
@ terdon Bunu cevabında zaten belirtmiştim, bunu söylediğimde aşağı oyu hak ettiğini sanmıyorum.
Mark Kirby,

1
Bu A LOT daha hızlı olduğunu unutmayın find /olarak locateise, bir veritabanından aramalar findyinelemeli listeleri /sonra ve normal ifadeyle eşleşir.
Timothy Gu

14

Terminali açın ve aramaya başlamak istediğiniz dizini dizinlere getirin ve ardından şu komutu çalıştırın:

find . -name "*bat*" -type f 

Geçerli .dizinden find komutunu başlatır.
Dizeyle -nameeşleşir batve büyük / küçük harf duyarlıdır. ( -inameDuyarsız olduğu) sadece dosyalar için arar.
-type f


sil ve silme ok +1: P;)
AB

6

Dosyalar geçerli dizinde ise:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Veya (satır satır satır yapmak için):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Bu dosyalar için sistemi aramak istiyorsanız, şunu kullanın:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
Aramanız kök diziniyle başlıyorsa, bu komut bazı klasörler için 'İzin verilmedi' raporunu vereceği için sudo eklemek isteyebilirsiniz
Sergiy Kolodyazhnyy

4

findKomutu büyük / -inameküçük harf duyarsız dosya adı eşleştirme seçeneğiyle birlikte kullanmak-name seçeneği . Bunların her ikisi de joker karakter adlarını kullanmanıza izin verecektir. Yani, "yarasa" içeren herhangi bir dosya adını bulmak için kullanacağınız:

find / -iname '*bat*'

Veya

find / -name '*bat*'

*Araçlar arama aradığı böylece "herhangi bir karakter (ler)", batbaşında veya sonunda, hiçbiri dahil olmak üzere herhangi karakterler ile. /Kök dizinden yapılan aramaları art .arda alarak, geçerli dizinden yinelemeli olarak arama yapacak olanı veya aramak istediğiniz yerin mutlak yolunu kullanabilirsiniz. Linux shell komut dosyasında regex kullanarak dosyaları nasıl aradığına bir göz atın


@EliahKagan teşekkürler, cevabımı biraz daha bilgi ekledim.
AJefferiss

+1 Düzenleme için teşekkürler. IMO , basitçe dizinleri dışlamaktan daha fazlasını yapan ve çoğu zaman kullanıcıların gerçekte istediği şey olan , ayırt edici olmayan kullanımı tavsiye etmekten kaçınmanın bir cevabıdır . -type f
Eliah Kagan,

2

Eski güzel kullanın find.

find <path_for_search> -type f -iname "*bat*" 

Örneğin.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

from man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
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.