Grep 'Böyle bir dosya veya dizin yok' hatalarını nasıl yazdırabilirim?


215

Git tarafından yönetilen büyük bir kod yığını ile selamlıyorum ve ne zaman bir grep yaptığımda, formun yığınları ve yığınları görüyorum:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

Bu çizgileri ortadan kaldırmanın bir yolu var mı?


1
Ben kullanarak öneriyoruz Bugünlerde ag, ackya cgrepbunun yerine - onlar daha iyi / daha hızlı konum grepkod depoları aranması için.
lunixbochs

Eğer kod ile uğraşıyorsanız ve belirli dizinlerden kaçınmak istiyorsanız, belki de ack bakmalısınız. Bu bir kaynak kodu farkında grep ve bu nedenle bu tür VCS dizinlerini (vi ve emacs yedekleri, kaynak olmayan dosyalar vb.) Aktif olarak yok sayar.
Brian Agnew

2
Bir kullanıcı No such file or directoryvarolan dosyalar ve / veya dizinler için iletileri nasıl alabilir ? Ya da tam tersine, grep *var olmayan dosyaların adlarını nasıl alabilirim ? Bu grep, çalışırken başka bir işlemin dizin ağacını (dosyaları oluşturma, yeniden adlandırma ve silme) değiştirdiği bir yarış durumu mu?
Scott

Yanıtlar:


299

Hataları bastırmak için -sveya --no-messagesişaretini kullanabilirsiniz.

-s, --no-messages hata iletilerini bastırır

grep pattern * -s -R -n

14
@Alex @Dogbert Bu soruya cevap verir, ancak '-s' problemleri maskeleyebilir, örneğin grep ile xargs kullandığınızda. Her ikisi de 'bazı metin' dizesini içeren 'aaa.txt' ve 'a b.txt' dizinlerinde 2 dosya oluşturmayı deneyin. Komut /bin/ls -1 | xargs grep 'some text'size "böyle bir dosya veya dizin yok" verecektir, çünkü bir b.txt dosyasını 2 bağımsız değişkene böler. Bastırırsanız, bir dosyayı kaçırdığınızı fark etmezsiniz.
Kelvin

@Kelvin, örneğin ile birlikte kullanır findve kullanırsam bu sorunu çözer mi? Teşekkürlerprint0xargs -0
Luka

1
@Luka Bu sorunu çözmeli. Her zaman bu NUL seçeneklerini kullanırsanız sorun yaşamayacaksınız, ancak kullanmıyorsanız, en uygunsuz zamanda unutacağınız neredeyse garanti (IMHO).
Kelvin

Bu, diğer seçeneklerin (--quiet) çalışmadığı Mac OS X'de çalışır
philshem

59

Git deposundan geçiyorsanız, kullanmanızı tavsiye ederim git grep. Yoldan geçmenize gerek yok -R.

git grep pattern

Bu, geçerli dizininizdeki tüm eşleşmeleri gösterir.


5
Git'e özgü komut için +1. Svn olsa işe yaramaz :-)
cadrian

2
+1 Bu git komutunu kaçırdım - bu, herhangi bir komutta ağacın durumundan bir dize grep yapmamı sağlar ("pattern" den sonra exec ekleyerek).
Kelvin

1
Kaçak eklentiyle, GgrepGit dizininin başından geçerli dizin yerine başlayarak da arama yapar.
Ciro Santilli 法轮功 at 病 六四 事件 法轮功

Bu standart grep'ten çok daha hızlı görünüyor. (Belki de ikili dosyaları, vb. Yok sayar? Hiçbir fikrim yok, ama yararlı.)
Daniel

10

Bunun gibi hatalar genellikle "standart hata" akışına gönderilir; bu dosya, bir dosyaya aktarılabilir veya yalnızca çoğu komutta kaybolabilir:

grep pattern * -R -n 2>/dev/null

Soruyu cevaplar, ancak sorunları maskeleyebilir. Yorumuma Dogbert'in cevabı altında bakın.
Kelvin

5

Birkaç kez, kırık bağlantılar (var olmayan dosyalara işaret eden semboller) ile grep, var olan hedef dosya üzerinde arama dener (dolayısıyla doğru ve doğru hata mesajı) gördük.

Ben normalde konsol üzerinde sysadmin görevleri yaparken rahatsız etmiyorum, ama komut dosyaları içinde "find" ile metin dosyaları aramak ve sonra her birini grep:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

Onun yerine:

grep -nRHi -e "widehat" /etc

4

Genellikle grep'in özyinelemeyi kendisi yapmasına izin vermem. Genellikle atlamak istediğiniz birkaç dizin vardır (.git, .svn ...)

Bunun gibi duruşlarla akıllı takma adlar yapabilirsiniz:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

İlk bakışta aşırıya kaçmış gibi görünebilir, ancak bazı desenleri filtrelemeniz gerektiğinde oldukça kullanışlıdır.


1
+1. Bu, hataları bastırmaktan çok daha iyidir. Ancak, bence -execgrep'ten önce unuttun .
Kelvin

1
Ne anlama geliyor? \( -name .svn -o -name .git \)
sbhatla

Neden grep'in --exclude veya --exlcude-dir bayraklarını kullanmıyorsunuz?
Choylton B. Higginbottom

1
@sbhatla parantezin find komutu için bir işlem sırası oluşturur. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom

4

Bu -0seçeneği xargs'ta denediniz mi? Bunun gibi bir şey:

ls -r1 | xargs -0 grep 'some text'

2
bulmak için -print0 eklemeniz gerekirfind -print0 | xargs -0 grep 'text'
aliva

1

-IGrep'te kullanın .

Örnek: grep SEARCH_ME -Irs ~/logs.


1
-Iikili dosyaları atlar - buna eşdeğerdir --binary-files=without-match. Yine de "Böyle bir dosya veya dizin yok" iletilerini bastırmaz.
mwfearnley

0

Ben yönlendirmek stderriçin stdoutve daha sonra kullanım grep en invert maç ( -v) Ben postu istediğiniz uyarı / hata dizesini dışlamak için:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
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.