Bir dosyanın içeriği yerine dosya adı için nasıl "grep" yapılır?


135

grep, herhangi bir satırın belirli bir düzenli ifadeyle eşleşip eşleşmediğini görmek için bir dosya içinde arama yapmak için kullanılır. Ancak, bu durum var - dosya adının kendisiyle eşleşecek (dosyanın içeriğiyle değil) normal bir ifade yazmak istiyorum. Normal ifadeyle eşleşen tüm dosyaları bulmak için bunu sistemin kök dizininden çalıştıracağım.

Örneğin, "f" ile başlayan ve .frm ile biten tüm VB form dosyalarını bulmak istersem, normal ifadeyi kullanacağım -

   "f[[:alnum:]]*\.frm"

Grep bunu yapabilir mi? Değilse, bunu yapmama izin verecek bir yardımcı program var mı? Teşekkürler.

Yanıtlar:


120

Bu durumda findyerine kullanmanız gerekir grep.

Ayrıca veya findile kombinasyon halinde de kullanabilirsiniz :grepegrep

$ find | grep "f[[:alnum:]]\.frm"

12
Bu gereksizdir. Bul, bu işlevle birlikte yerleşik olarak bulunur -regex.
whereswalden

4
burada gereksizdir, ancak grep perl regex'i desteklerken find desteklemez.
Dan

2
Hayır, grep kullanabilirsiniz. Bul kullanmaktan çok daha kolay. "-Rl" anahtarını ekleyin ve dosya yerine dosya adını arayacaktır. Aşağıdaki yazıma bakın.
RM

@ alpha_989, grep'in desteklediğini söyledim, ki bunu yapıyor: gnu.org/software/grep/manual/html_node/… noktası, grep'e borulama sadece pcre'ye ihtiyacınız varsa gereklidir. whereswalden doğru yanıtı veriyor
Dan

60

Misal

find <path> -name *FileName*

Kılavuzdan:

bul-adı kalıbı

Dosya adının tabanı (baştaki dizinlerin kaldırıldığı yol) kabuk kalıbı deseniyle eşleşir. Baştaki dizinler kaldırıldığından, -name ile eşleşme için düşünülen dosya adları hiçbir zaman bölü çizgisi içermez, bu nedenle "-name a / b" hiçbir zaman hiçbir şeyle eşleşmez (muhtemelen bunun yerine -yol kullanmanız gerekir). Metakarakterler ("*", "?" Ve "[]") bir "" ile eşleşir. temel adın başlangıcında (bu, find-utils-4.2.2'de bir değişikliktir; aşağıdaki STANDARTLAR UYGUNLUK bölümüne bakın). Bir dizini ve altındaki dosyaları yok saymak için -prune kullanın; -yol açıklamasında bir örneğe bakın. Bash de dahil olmak üzere bazı mermilerin, kabuk desenlerinde özel bir anlam taşıyan parantezleri aşılamasına rağmen, korselerin özel olduğu kabul edilmiyor. Dosya adı eşlemesi, fnmatch (3) kitaplık işlevi kullanılarak gerçekleştirilir. Kabuk tarafından genişlemesini önlemek için deseni tırnak içine almayı unutmayın.


2
Bu cevabı en kullanışlı buldum. Birkaç ek seçenek ekledim: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

Pablo dediği gibi, kullanmak gerek findyerine grep, ancak gerek borusuna var findetmek grep. findyerleşik şu işlevselliğe sahiptir:

find . -regex 'f[[:alnum:]]\.frm'

finddosyaları ada göre aramak için çok güçlü bir programdır ve dosya türüne göre aramayı, derinlik sınırlamasını, farklı arama terimlerini boole işlemleriyle birleştirmeyi ve bulunan dosyalar üzerinde rastgele komutları çalıştırmayı destekler. Daha fazla bilgi için bul sayfasına bakın .


1
Tarihe göre arama yapmak için çok kullanışlı bir özellik -mtime-mmin
eklerim

1
Ayrıca, -regex anahtarı tüm yolla eşleşmeler gerçekleştirir. Dolayısıyla, çalışabilmek için örneğin normal ifadenin başına. * Eklemesi gerekir.
tumasgiu

15

Bir dosyanın tam yolunu grep kullanarak bulabilirsin, sadece ağacın çıktısını çıkar.

tree -f | grep filename

İşte .bash_profile veya .bashrc dosyanıza koyabileceğiniz bir işlev

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f isteğe bağlıdır.
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor türleri: -

f: normal dosya

d: dizin

l: sembolik bağlantı

c: karakter aygıtları

b: cihazları engelle


1
Yalnızın ardından bir dosya adı kullanamıyorum -type typedescriptor. Bu bir hata mı?
Allan Nørgaard

5

Ayrıca şunları da yapabilirsiniz:

tree | grep filename

Bu ağaç komutunun çıktısını arama için grep'e yönlendirir. Bu sadece dosyanın var olup olmadığını söyleyecektir.


1

Hayır, grep bunun için gayet iyi çalışıyor:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
Bu, dosya içeriğinde "dosya adı" arar ve ardından eşleşen dosyaların adlarını yazdırır. OP, dosya içeriklerinin değil dosya adlarının eşleşmesini istiyor.
Matthew

1
Kabul edildi, bu dosya adlarını aramaz, yalnızca içerik eşleştiği bulduğu dosya adlarının adlarını yazdırır . Hem yanlış anladın -lve -Lönemli ölçüde seçenekleri.
Prometheus

2
+1 tam ihtiyacım olan şey olduğu için. İhtiyacım olan cevabı bulmak için soruyu eleştirmek zorunda olmadığım için
Alexander McNulty

-1

Ayrıca birden fazla dosya için.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

En kolay yol

find . | grep test

burada find (.) yani geçerli dizindeki tüm dosyaları özyinelemeli olarak listeleyecektir. Ve sonra bu sadece basit bir grep. adı "test" olan tüm dosyalar görünecektir.

ihtiyacınıza göre grep ile oynayabilirsiniz. Not: grep genel dizge sınıflandırması olduğundan, size yalnızca dosya adları vermeyebilir. ancak bir yolun bir dizini varsa ('/xyz_test_123/other.txt') sonuç kümesine de gelir. şerefe


Bu, yolda "test" yazan her şeyi bulacaktır, örn ./foo/bar/latest/fred.txt.
Paul R

ah. Bunu düşünmediğim. Bahsettiğiniz için teşekkür ederim.
sachyy
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.