Geçerli ve alt klasörlerdeki tüm dosyaları joker karakter eşleştirmesine dayalı olarak özyineli olarak nasıl bulabilirim?


1887

Geçerli ve alt klasörlerdeki tüm dosyaları joker karakter eşleştirmesine dayalı olarak özyineli olarak nasıl bulabilirim?

Yanıtlar:


2741

Bunun için bul komutunu kullanın :

find . -name "foo*"

findbir başlangıç ​​noktasına ihtiyaç duyar ve .(nokta) geçerli dizini gösterir.


21
Bu linux olarak etiketli biliyorum ama bu söz değer: yol linux olmayan diğer * nix varyantları için gereklidir. Linux'ta, nokta kullanmak istiyorsanız yol isteğe bağlıdır.
IslandCow

4
@Seatter "foo *", "foo" ile başlayan tüm dosyaları aramayı söyler. Bu sadece onun örneğidir. Adları gpio ile başlayan tüm dosyaları bulmak için "gpio *" veya gpio1 adlı tüm dosyaları bulmak için sadece "gpio1" kullanabilirsiniz.
schumacher574

29
"foo *" tırnak işaretleri içinde olduğunu unutmayın, böylece kabuk bulmak için geçmeden önce onu genişletmez. eğer yaptıysan find . foo*, foo*genişletilecekti ve SONRA bulmaya geçti.
grinch

33
Worth vurgulayarak " "özyinelemeli arama için çok gereklidir.
WesternGun

3
Ayrıca yararlı: Dizinler hakkında bildirim almak istemiyorsanız (veya diğer hatalar), şunları yapabilirsinizfind . -name "foo*" 2>/dev/null
Jobbo

221

Grep'e boru bulmak genellikle daha uygundur; size rastgele joker karakter eşleşmesi için düzenli ifadelerin tam gücünü verir.

Örneğin, dosya adında büyük / küçük harfe duyarlı olmayan "foo" dizesi bulunan tüm dosyaları bulmak için:

~$ find . -print | grep -i foo

57
findAyrıca vardır -iname, -regexve -iregexbu yüzden etmek, küçük harf duyarsız joker, regex ve küçük harf duyarsız düzenli ifade eşleşmesi için bayraklar boru grepgereksizdir.
iobender

7
Gereksiz olmakla ilgili değil, daha rahat olmakla ilgili olduğunu düşünüyorum.
Elijah Lynn

1
Bununla birlikte, grep -v'ye borulama, istemediğiniz girdileri kaldırmak için basit dizeler veya regex'ler kullanmanıza izin verebilir.
door_number_three

3
@iobender - Ne yazık ki, tüm sistemlerin findbu seçenekleri destekleyen bir komutla gelmediğini size söyleyebilirim . Bazen greptek seçenek haline gelir.
Bay Llama


39
find -L . -name "foo*"

Bazı durumlarda, sembolik dizin bağlantılarını işlemek için -L parametresine ihtiyacım var. Varsayılan olarak sembolik bağlantılar yoksayılır. Bu durumlarda, dizini bir alt dizine değiştirip desenle eşleşen dosyayı göreceğimizden, ancak dosya adını döndürmeyeceğinden oldukça kafa karıştırıcıydı. -L kullanmak bu sorunu çözer. Bulmak için sembolik bağlantı seçenekleri -P -L -H


1
L anahtarı çok faydalıdır. Çoğu zaman kullanıcı, ister bağlı ister normal dizin olsun, temel dizinler hakkında hiçbir fikre sahip değildir. Şüphe durumunda, L seçeneğini kullanmak her zaman iyidir. En azından bana her zaman yardımcı oldu.
Ritesh

2
Benim için cevap buydu. Teşekkürler!
iedmrc

33

Kabuğunuz yeni bir globbing seçeneğini destekliyorsa (tarafından etkinleştirilebilir :)shopt -s globstar , şunları kullanabilirsiniz:

echo **/*foo*

herhangi bir dosya veya klasörü özyinelemeli bulmak için. Bu Bash 4, zsh ve benzeri kabuklar tarafından desteklenir.


Şahsen ben tanımlanmış bu kabuk fonksiyonu var:

f() { find . -name "*$1*"; }

Not: Yukarıdaki satır doğrudan kabuğa yapıştırılabilir veya kullanıcı ~/.bashrcdosyasına eklenebilir .

Sonra yazarak herhangi bir dosya arayabilirsiniz:

f some_name

Alternatif olarak, basit bir sözdizimine sahip bir fdyardımcı programı kullanabilirsiniz , ör fd pattern.


1
Bu sadece tek bir seviyeye gidiyor. Benim için alt dizinlere
yinelenmiyor

3
@Broncha Genişletilmiş globbing'i shopt -s globstarkomutla etkinleştirmeniz gerektiğinden . Bu Bash, zsh ve benzeri kabuklarda desteklenir.
kenorb

bash-3.2$ shopt -s globstarverirbash: shopt: globstar: invalid shell option name
drewish

Bash'inizi 4.x'e yükseltmeniz gerekiyor
kenorb

echo * / * foo bulmaktan daha hızlı
Josef Klimuk

32

fd

Durumda, find, deneyin çok yavaş fdbasit ve hızlı bir alternatiftir - yarar findRust yazılmış.

Sözdizimi:

fd PATTERN

Demo:

Ana sayfa: https://github.com/sharkdp/fd


17
İlk defa neredeyse 9 yıl içinde SO'da bir gif gördüm. İyi iş!
Joshua Pinter

1
Bu performans sonuçları umut vericidir.
Home

konu dışı: demo için svg dosyası oluşturmak için hangi aracı kullandınız?
aprodan

2
@aprodan Demo görüntüsü GitHub'dan kopyalandı, ancak kullandıklarına asciinema, ardından GIF formatına dönüştürüldüklerine inanıyorum , ancak emin değilim.
kenorb

1
Aslında SVG biçimindedir, bu yüzden muhtemelen asciicast2vectorkullanılabilir.
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

Joker karakter eşleşmesinde, eşleştirmek istediğiniz dizeyi sağlayabilirsiniz, örneğin * .c (tüm c dosyaları için)


1
Yanıtınız burada belirtilen ilk dosya olduğu için en doğru olanıdır. Türü belirtmeyen diğerleri dizinleri döndürür.
wilsotc

"-type f" dizini aramak isterseniz "-type d" olarak değiştirilebilir
XYZ_Linux

11

Kullanabilirsiniz:

# find . -type f  -name 'text_for_search'

REGX kullanımı istiyorsanız -iname

# find . -type f  -iname 'text_for_search'

9

Aşağıdaki komut, geçerli ve alt klasörlerinde tam adı "desen" (örneğin) olan tüm dosyaları listeler.

find ./ -name "pattern"


8

Özyinelemeli dosya aramanın varsayılan yolu ve çoğu durumda kullanılabilir

find . -name "filepattern"

Konumlandığınız geçerli dizinden dosya adı veya desen için özyinelemeli geçiş yapmaya başlar. Find komutuyla, seçeneklerin tam listesini görmek için joker karakterleri ve çeşitli anahtarları kullanabilirsiniz.

man find

veya sisteminizde man sayfaları yoksa

find --help

Ancak, daha sonra tüm dosya sisteminizde gezinen ve dosyalarınızı endeksleyen daha modern ve daha hızlı araçlar var, böyle yaygın bir araç bulun veya slocate / mlocate, işletim sisteminizin nasıl kurulacağına dair el kitabını kontrol etmelisiniz ve yüklü veritabanı başlatmak gerekiyor, eğer yükleme komut dosyası sizin için yapmazsanız, yazarak manuel olarak yapılabilir

sudo updatedb

Ve belirli bir dosya türünü aramak için kullanmak için

locate filename

Veya geçerli dizinden dosya adı veya pıtırtı aramak için şunu yazabilirsiniz:

 pwd | xargs -n 1 -I {} locate "filepattern"

Dosya veritabanına bakacak ve yazdığınız desenle eşleşen yol adlarını hızlı bir şekilde yazdıracaktır. Konum seçeneklerinin tam listesini görmek için şunu yazın: locate --helpveyaman locate

Ayrıca, cron işi aracılığıyla veritabanını planlanan zamanlarda güncellemek için konumlandırma yapılandırabilirsiniz, böylece 1AM'de db'yi güncelleyen örnek cron şöyle görünecektir:

0 1 * * * updatedb

Bu cron işlerinin root tarafından yapılandırılması gerekir, çünkü updatedb tüm dosya sistemini çaprazlamak için root ayrıcalığına ihtiyaç duyar.


7

dosya arama için
find / -xdev -name settings.xml -> tüm bilgisayar
find ./ -xdev -name settings.xml -> geçerli dizin ve alt dizini

uzantısı olan dosyalar için

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

6

Yinelemeli olarak gideceğimizde yer tespitinin çok fazla kullanılmadığını görünce şaşırdım.

Öncelikle ilgili geçerli klasördeki dosyaların listesini almak için bir "$ PWD" bulun ve sonra ben istedikleri gibi üzerlerinde greps çalıştırın.

locate "$PWD" | grep -P <pattern>

Tabii ki, bu updatedb yapıldığını ve dizinin periyodik olarak güncellendiğini varsayar. Bu, dosyaları bulmanın ve ağaçtan aşağı gitmesini istemekten daha hızlı dosya bulmanın yoludur. Bunu bütünlük için belirtmek. Ağaç çok ağır değilse, bulmaya karşı hiçbir şey yok.


locate "$PWD*.mp4" Sadece atlayabileceğinizi hatırlatmak içingrep
Jefferey Mağarası

5

Aşağıdaki komut herhangi bir dosyayı aramaya yardımcı olur

1) Durumdan bağımsız olarak
2) Sonuç İzinsiz klasörleri hariç tutma
3) Kökten veya istediğiniz yoldan arama yapma. İstediğiniz yolu / ile değiştirin.

Sözdizimi:
find -iname '' 2> & 1 | grep -v "İzin reddedildi"

Örneği

bul / -iname 'C * .xml' 2> & 1 | grep -v "İzin reddedildi"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
bunun için neden dünyada grep kullanıyorsun? find / -iname '*C*.xml' 2>/dev/null
Stderr'i

3

Joker karakterle özel bir dosya aramak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

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

Her bir .conf dosyasını buradan aramak istediğinizi varsayalım:

.buradan başlayan arama (geçerli yer)
-type, burada dosya (f) olan arama öğesinin türü anlamına gelir. * .conf adlarına
-namesahip dosyaları aramak istediğiniz anlamına gelir .


3

Bu, geçerli ve alt dizinlerdeki tüm ilgili dosyaları arayacak ve satır sayısını ayrı ayrı ve tamamen hesaplayacaktır:

find . -name "*.wanted" | xargs wc -l

2

kullanım

find path/to/dir -name "*.ext1" -o -name "*.ext2"

açıklama

  1. İlk parametre aramak istediğiniz dizindir.
  2. Varsayılan olarak findözyineleme yapar.
  3. -oAçılımı -or. Yani yukarıda bu joker karakteri VEYA bunu arayın. Sadece bir desene sahipseniz, buna gerek yok -o.
  4. Joker karakter deseninin tırnak işaretleri gereklidir.
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.