Grep, uyarıları yoksay


50

Belirli bir paketin kurulum dizinini bulmaya çalışıyorum. Belirli bir dosyayı bulmaya çalıştığım belirli bir anahtar kelimeye sahibim.

Grep sırasında, sadece cpp veya h dosya tipini eklemek istiyorum . Grep'in İzin Reddedildi veya Dizini bulamadı gibi uyarılar göstermesini istemiyorum . Sadece eşleşen dosyaları göstermesini istiyorum, başka bir şey yok. Lütfen bunu nasıl yapabilirim?

Şu anda kullanıyorum

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Yanıtlar:


56

Bu uyarılar stderr, standart dosya tanıtıcısının aksine , akışa yönlendirilir . Stderr çıkışını 2>/dev/nullkomutunuzun sonuna ekleyerek susturabilirsiniz .


Daha açık olmak gerekirse find . 2>/dev/null | grep 404.htmlbir
emeğin

30

Uyarıları filtrelemekten daha fazlasını, ekleyerek bunları devre dışı bırakabilirsiniz -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Bu seçenekle ilgili bazı uyumluluk sorunları var. Ancak, bu kişisel kullanım için bir sorun olmamalıdır.

-s, --no-messages: Var olmayan veya okunamayan dosyalar hakkındaki hata iletilerini bastır. Taşınabilirlik notu: GNU grep'ten farklı olarak, 7. Baskı Unix grep, POSIX ile uyumlu değildi, çünkü -q ve -s seçeneği GNU grep's -q seçeneği gibi davranıyordu. USG tarzı grep de -q'den yoksundu ama -s seçeneği GNU grep gibi davrandı. Taşınabilir kabuk komut dosyaları hem -q hem de -s'den kaçınmalı ve bunun yerine standart ve hata çıktısını / dev / null konumuna yönlendirmelidir. (-s POSIX tarafından belirtilmiştir.)


13.04'ü yeni yükledim ve 12.04'te almadığım hataları alıyorum. Bir şey değişmiş olabilir mi? Grep'in dosyaların dizin olduğu konusunda uyarı vermemesinin iyi olacağını düşündüm, çünkü çoğu zaman umrumda değil!
Alexis Wilke

Üzgünüm, hala 12.10'dayım, bu yüzden bunu onaylayamıyorum.
Sebastian vom Meer,

5

Bunun gibi bir sürü rahatsız edici mesaj alırdım:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

Sebep, --directoriesbayrağın varsayılan olarak ayarlanmış olmasıdır read. Olarak değiştirdim recurse; otomatik olarak yinelemeli bir arama yapmasını istemiyorsanız, onun skipyerine kullanabilirsiniz .

Bunu her zaman halletmenin en kolay yolu, onu bir ortam değişkenine ayarlamaktır. Gelen ~/.bash_profileveya ~/.bashrckendi distronuza bağlı:

export GREP_OPTIONS='--directories=recurse'

Artık grep kullandığımda bu mesajları otomatik olarak bastırıyor.

Başka bir seçenek de --no-messagesbayrak, steno -s. Bu aynı zamanda Is a directorymesajlardan kurtulacak , ancak daha yararlı olabilecek diğer mesajları da bastıracak. Örneğin, içine yuvalanmış bir arama yapıyorsanız */*/*ve bu şablonun böyle bir dosyası bulunmuyorsa, bunu size söylemez.


iyi açıklama
aldr

1

Yerine yapmanın alternatif yaklaşım grepile yinelemeli -ir izin olurdu findile izinleri işlemek (varsayılan olarak özyinelemeli olan) komutu -readableile dışlamak için bayrak ve yol en -not -path "*.svn*"bayrakları ve sonra dosyayı geçmek grep. Dizinlerin hariç tutulması -type fsadece düzenli dosyalar bulmak için yapılır .

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

Belirli dosyalarda özyinelemeli aramalar yaparken, kullanmaktan çok daha iyidir ack-grep. Buradaki sözdizimi şöyle olur:

ack-grep -i "My term" --cpp --h

İzin hata mesajlarını kaldırmak için aynı komutu şu şekilde çalıştırmak isteyebilirsiniz sudo:

ack-grep -i "My term" --cpp --h

Ancak, sonunda, yüklü paketleri aramak istiyorsanız, şu çeşitli seçeneklere bakın: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

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.