Bir metin dizesi içermeyen bütün dosyaları nasıl bulabilirim?


40

Bir metin dizesi içermeyen tüm dosyaları bulmak için hangi özlü komutu kullanabilirim?

Bunu (grep'in parametrelerini tersine çevirmek için -v kullanarak) şanssızlıkla denedim:

find . -exec grep -v -l shared.php {} \;

Birisi bunun işe yarayacağını söyledi:

find . ! -exec grep -l shared.php {} \;

Ama benim için işe yaramıyor.

Bu sayfada şu örnek var:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

Ama bu çok hantal ve özlü değil.

ps: Bunu grep -L *yapacağımı biliyorum , ancak hariç tutulan dosyaları bulmak için find komutunu grep ile birlikte nasıl kullanabilirim.

pss: Ayrıca grep'in grep -L *sözdizimine sahip alt dizinleri içerdiğinden emin değilim , ancak yine de nasıl kullanılacağını bilmek istiyorum find:)


1
Yazdığın ilk komut bilgisayarımda iyi çalıştı. Hangi bulma sürümünü kullanıyorsunuz? Ve biz onunla çalıştığımızdan, belki de hangi
unix'i

@rahmu, bu komut neredeyse her zaman beklediğiniz gibi çalışmıyor. Muhtemelen çok özel bir durum olmuştur. Lütfen unix.stackexchange.com/questions/339619/…
sgnsajgon

Yanıtlar:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

VEYA

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Burada -cbir dosyadaki eşleşen satır sayısını (kullanarak ) hesaplıyoruz, eğer sayım 0'dan sonra gerekli ise, yani ilk sütunu yani dosya adını çıktıdan kesiyoruz.


6
Bu çok karmaşık. Kevin'in cevabını görün .
Gilles 'SO- şeytan olmayı'

@Gilles evet sana katılıyorum. Cevabını + 1'ledim.
Sachin Divekar

6
Bu sadece "son derece karmaşık" bir şey değil , aynı zamanda desene uyan 10 satırın çoğunu içeren tüm dosyaları da listeleyeceği için yanlıştır . grepDüzeltilmiş olsa bile , bu yine de yeni karakter içeren dosya isimleri :veya yeni karakterler
içermez

@ don_crissti, bahsettiğiniz için teşekkürler! Yine de, çok fazla kopyala-yapıştır kodu kullanmazsanız, yukarıdaki çözüm iyi bir hiledir.
Ufos

@Ufos - Gerçekten yorumunuzu alamadım ... Bu yanlış . Her neyse, size "gerçekten güzel bir hile" gibi görünüyorsa kullanmaktan çekinmeyin ...
don_crissti

56

Şunu bulursanız, -v -l(eşleşmeyen herhangi bir satırı olan -Ldosyalar ) olarak (satır eşleşmeyen dosyalar) değiştirirseniz çalışmalısınız, ancak grep'recursive ( -r)' seçeneğini de kullanabilirsiniz :

grep -rL shared.php .

hangi bulmalı?
cwd

@Kevin - üzgünüm, find . -exec grep -v -l shared.php {} \;(ve denediğim diğer tüm değişkenler) benim için çalışmıyor. OS X'deyim ama bunun önemli olduğunu düşünmüyorum. Sana bir + 1 verdim çünkü -rseçenek hakkında unutmuştum .
cwd

@cwd bunun eski olduğunu biliyorum ama bunu gelecekteki okuyucular için burada bırakmak istiyorum: OS X'te olduğunuz gerçeği bir fark yaratıyor. Mac OSX FreeBSD komutlarını kullanır. Buradaki çoğu kişi Linux (GNU) stili komutları alır. Farklı argümanlara, ayrıntılarla başa çıkmanın farklı yollarına sahipler.
Rich Homolka

OSX 2016'dan itibaren destek veriyor gibi görünüyor-L
David Moles

@kevin Yaptım, değil. :) kimsenin açıkça söylemediği söylenmedi, ama yorumlar kafa karıştırıcıydı (ve kesinlikle diğer OS X / BSD'ye karşı GNU sorunları ile karşılaştım).
David Moles,

4

Bunu grep -L *yapacağımı biliyorum , ancak dosyaları dışlamak için bu findkomutu nasıl kullanabilirim, grepgerçekten bilmek istediğim şey

Bunu kullanabilir findve grepbu gibi olabilir :

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Burada -printyalnızca önceki ifade: ! -exec ... {}değerlendirilirse uygulanır true.
Yani her dosya bulunamadı için, grep -q 'PATTERN'bir execsonuç ise, uted falsetüm ifade ardından ! -exec grep -q 'PATTERN'değerlendirir olarak trueve dosya adı olduğu printed.


2
Bu standart ve taşınabilir olma avantajına sahiptir.
Stéphane Chazelas 2:15

Yine de GNU’lar grep -Larasında bir fark var . Listede okunamayan dosyaları da içeriyor.
Stéphane Chazelas 2:15

1

-L seçeneğiyle eşleşen sonucu bulamıyorsunuz

grep -iL shared.php .

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.