grepで「そのようなファイルまたはディレクトリはありません」というエラーを出力しないようにするにはどうすればよいですか?


215

私はgitによって管理されている大量のコードをgrepしていて、grepを実行するたびに、次の形式のメッセージの山が表示されます。

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

これらの線を消す方法はありますか?


1
これらの日、私は使用をお勧めしたいagackまたはcgrepその代わり-彼らはより良いより/はるかに高速だgrepコードリポジトリを検索します。
lunixbochs 2014

コードを手探りで特定のディレクトリを避けたい場合は、ackを確認する必要があります。これはソースコード対応のgrepなので、そのようなVCSディレクトリ(およびviとemacsのバックアップ、非ソースファイルなど)を積極的に無視します。
Brian Agnew

2
ユーザーは、No such file or directory存在するファイルやディレクトリのメッセージをどのように取得できますか?または、逆に、grep *存在しないファイルの名前を取得するにはどうすればよいですか?これは競合状態grepですか?の実行中に他のプロセスがディレクトリツリーを操作します(ファイルの作成、名前変更、削除)。
スコット

回答:


299

-sまたは--no-messagesフラグを使用してエラーを抑制できます。

-s、-no-messagesはエラーメッセージを抑制します

grep pattern * -s -R -n

14
@Alex @Dogbertこれは質問に答えますが、 '-s'は、grepでxargsを使用する場合など、問題を隠すことができます。ディレクトリに「aaa.txt」と「a b.txt」の2つのファイルを作成してみてください。どちらにも「some text」という文字列が含まれています。コマンド/bin/ls -1 | xargs grep 'some text'は「a b.txt」を2つの引数に分割するため、「そのようなファイルまたはディレクトリはありません」と表示されます。抑制しても、ファイルを見逃したことに気付かないでしょう。
ケルビン

@Kelvinはfind使用print0xargs -0ます。たとえば、使用して使用すると、問題は解決しますか?ありがとう
Luka

1
@Lukaそれで問題は解決するはずです。これらのNULオプションを常に使用する場合は問題に遭遇しませんが、使用しない場合は、最も不都合なときに忘れることがほぼ保証されます(IMHO)。
ケルビン

これは、他のオプション(--quiet)が機能しないMac OS Xで動作します
philshem

59

gitリポジトリをgrepする場合は、を使用することをお勧めしますgit grep。パス-Rやパスを渡す必要はありません。

git grep pattern

それはあなたの現在のディレクトリの下からすべての一致を表示します。


5
有用なgit固有のコマンドの+1。SVNのための作業ものの:-)ません
cadrian

2
+1これは私が見逃していたgitコマンドです-これにより、(「パターン」の後にコミットを追加することによって)コミットのツリーの状態から文字列をgrepできます。
ケルビン

1
一時的なプラグインをGgrep使用すると、現在のディレクトリではなく、Gitディレクトリの先頭から検索も行われます。
Ciro Santilli郝海东冠状病六四事件法轮功

これは標準のgrepよりもかなり高速であるように見えます。(おそらく、バイナリファイルなどを無視しますか?わかりませんが、便利です。)
Daniel

10

そのようなエラーは通常、「標準エラー」ストリームに送信されます。これは、ファイルにパイプするか、ほとんどのコマンドで単に非表示にすることができます。

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

質問に答えますが、問題を隠すことができます。Dogbertの回答の下にある私のコメントを参照してください。
ケルビン

5

壊れたリンク(存在しないファイルを指すシンボリックリンク)で、grepが存在しないターゲットファイル(したがって、正確で正確なエラーメッセージ)を検索しようとするのを何度か見ました。

私は通常、コンソールでsysadminタスクを実行している間は気にしませんが、スクリプト内から「find」を含むテキストファイルを探し、それぞれをgrepします。

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

の代わりに:

grep -nRHi -e "widehat" /etc

4

私は通常、grepに再帰を行わせません。通常、スキップするディレクトリがいくつかあります(.git、.svn ...)

そのようなスタンスで賢いエイリアスを作成できます。

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

一見過剰に見えるかもしれませんが、一部のパターンを除外する必要がある場合は、非常に便利です。


1
+1。これは、エラーを抑制するよりもはるかに優れています。しかし、-execあなたはあなたのgrep の前を忘れていたと思います。
ケルビン

1
これは何を意味するのでしょうか?\( -name .svn -o -name .git \)
sbhatla

grepの--excludeまたは--exlcude-dirフラグを使用しないのはなぜですか?
Choylton B. Higginbottom '25

1
@sbhatla括弧は、findコマンドの操作の順序を作成します。stackoverflow.com/questions/24338777/...
Choylton B. Higginbottom

4

xargsで-0オプションを試しましたか?このようなもの:

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

2
見つけるには-print0を追加する必要がありますfind -print0 | xargs -0 grep 'text'
aliva

1

-Igrepで使用します。

例:grep SEARCH_ME -Irs ~/logs


1
-Iバイナリファイルをスキップします-と同等--binary-files=without-matchです。ただし、「そのようなファイルまたはディレクトリはありません」というメッセージは抑制されません。
mwfearnley

0

リダイレクトしてstderrからstdoutgrepのinvert-match(-v)を使用して、非表示にする警告/エラー文字列を除外します。

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.