Dize içeren ada sahip tüm dosyaları bul


177

Ben dosya adında bir dize içeren geçerli dizinden dosyaları döndürecek bir komut arıyor. Gördüğüm locateve findbulabileceğiniz komutlar dosyaları şey ile başlayan first_word*ya da bir şey ile biten *.jpg.

Dosya adında dize içeren dosyaların listesini nasıl döndürebilirim?

Örneğin 2012-06-04-touch-multiple-files-in-linux.markdown, geçerli dizinde bir dosya olsaydı .

Bu dosyayı ve dizeyi içeren diğerlerini nasıl döndürebilirim touch? Gibi bir komut kullanmafind '/touch/'


soru kafa karıştırıcı. dize içeren dosyaları veya adları belirtilen dizeyi içeren dosyaları bulmak istiyor musunuz? ilk soru ile man grep, ikinci soru ile cevaplanır man find. neden adam kullanmak yerine google?
sadece birileri

1
Teşekkürler! İlk cümle, dosya içeriği mi yoksa dosya adı mı olduğunu belirtmedi. Güncellenmiş.
Dru

Yanıtlar:


303

Kullanım find:

find . -maxdepth 1 -name "*string*" -print

Geçerli dizindeki tüm dosyaları bulur ( maxdepth 1özyinelemeyi istiyorsanız sil ) "string" içerir ve ekranda yazdırır.

':' İçeren dosyadan kaçınmak istiyorsanız, şunu yazabilirsiniz:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Kullanmak istiyorsanız grep(ancak dosya içeriğini kontrol etmek istemediğiniz kadar gerekli olmadığını düşünüyorum) kullanabilirsiniz:

ls | grep touch

Ama tekrar ediyorum find, göreviniz için daha iyi ve daha temiz bir çözüm.


Teşekkürler @Zagorax. Bu tam olarak yapar. Komut çok uzun olmasaydı keşke :)
Dru

2
@Dru, Sütunlardan kaçınmak istiyorsanız kasayı kapsayacak şekilde değiştirildi. findçok güçlü bir araç, bir şekilde 'uzun' olmalı. :)
Zagorax

İlki teşekkürler herhangi bir içerik iade etmeden mükemmel yaptı.
Dru

3
@Dru, 'daha kısa' olmasını istiyorsanız, -printbu varsayılan davranış olduğundan ve .kontrol ettiği varsayılan klasör olduğundan kaçınabilirsiniz .
Zagorax

1
find . -name "*string*"Çok iyi çalışıyor. Kaldırma işlemi .sonlandırmamda bir hata veriyor. Tekrar teşekkürler @Zagorax.
Dru

14

Grep'i aşağıdaki gibi kullanın:

grep -R "touch" .

-Rdemek. Alt dizinlere gitmek istemiyorsanız, atlayın.

-i"durumu yoksay" anlamına gelir. Bunu da denemeye değer bulabilirsiniz.


Harika. Bazı dosya içeriklerinin a :. Bunu alıkoymak için yine de var mı? Belki bir seçenek mi kullanıyorsunuz?
Dru

1
Deneyin:grep -R "touch" . | cut -d ":" -f 2
carlspring

Bu sadece dosyaların içeriğini üretiyor gibi görünüyor. Aslında sorumu cevapladın, içeriği saklamak için biraz kazma yapmaya çalışabilirim.
Dru

Ah ... sadece dosya adlarına mı ihtiyacınız var? Koş: grep -R "touch" . | cut -d ":" -f 1 (üzgünüm seni yanlış okumalıydın).
carlspring

Teşekkürler @carlspring bu ilginç. grepya içerik ve dosya adları içeren touchveya içeren içerik döndürür touch, henüz durumdan emin değilim. Döndürülen dosyalar listesinden yarısı touchbaşlıkta, diğer yarısı touchbaşlıkta değil gövdede bulunur. Bunu fark ettim.
Dru

5

-maxdepthSeçenek önce olmalıdır -nameaşağıda gibi seçenek.,

find . -maxdepth 1 -name "string" -print

1
"String" in önüne ve arkasına * koymalısınız.
Aerin

3
find $HOME -name "hello.c" -print

Bu, tüm sistemi $HOME(yani /home/username/) “hello.c” adlı herhangi bir dosyayı arar ve yol adlarını görüntüler:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Ancak, eşleşmez HELLO.Cveya HellO.C. Büyük / küçük harfe duyarlı olmayan eşleşme -inameseçeneği aşağıdaki gibi iletilir:

find $HOME -iname "hello.c" -print

Örnek çıktılar:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Geçiş -type fyalnızca dosyaları aramak için bir seçenek:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-inameVersiyon find komutunun (OS X dahil) GNU veya BSD'de ya çalışır. Find komutunun sürümü desteklenmiyorsa -iname, grepkomutu kullanarak aşağıdaki sözdizimini deneyin :

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

Veya Dene

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Örnek çıktılar:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

Dize adın başındaysa, bunu yapabilirsiniz

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenbu çivi için uygun bir çekiç değildir. Bu az kullanılan araç, kullanılabilir komutları listelemek için tasarlanmıştır ve bu nedenle, geçerli dizindeki dosyaları (komut dosyaları olabilir) listeler ve bir dosya adının başlangıcını veya dosya içeriğinin başlangıcını geçemez, çoğunlukla işe yaramaz.
msanford

0

Halihazırda sağlanan birçok çözümün bir alternatifi globtan faydalanmaktır **. ( ) bashSeçeneğiyle birlikte kullandığınızda veya bundan yararlandığınızda, bunun için glob'u kullanabilirsiniz .globstarshopt -s globstarzsh**

**/bar

adlı dosyaları özyinelemeli bir dizin araması yapar bar(potansiyel barolarak geçerli dizine dosya dahil eder ). Bunun aynı yol segmentindeki diğer globbing formlarıyla birleştirilemeyeceğine dikkat edin; bu durumda, *operatörler normal etkilerine döner.

Burada zshve arasında ince bir fark olduğunu unutmayın bash. Iken bashdizinlere yumuşak bağlantıları zshgeçecek , olmayacak. Bunun için topak kullanmak zorunda ***/içinde zsh.


0
find / -exec grep -lR "{test-string}" {} \;

1
Bu cevap düşük kalite için işaretlendi. Lütfen önerilen değişikliklerinizin ne yaptığını açıklayın.
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
Bu, farklı bir sorunun cevabı gibi görünüyor - ancak hiçbir açıklama yapmadığınız için, bu asker ya da başkası için açık değil.
Toby Speight
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.