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.