web-dev-qa-db-ja.com

パイプとアンパサンドでgrepを使用して、findからエラーをフィルタリングする

Cygwinを使用して、cygdrive上のファイルを見つけています。

ただし、アクセス許可が拒否されたメッセージを抑制する必要があります(そうでない場合、結果はエラーメッセージに隠されます)。次のコマンドが機能します。

find -name 'myfile.*' |& grep -v "Permission denied"

アンパサンドをこのコマンドに入力する必要がある理由がわかりません。これは機能するはずですが、機能しません。

find -name 'myfile.*' | grep -v "Permission denied"

アンパサンドの意味を説明してください。

21
HKK

Unixライクなシステムでは、2つの出力パスがあり、変更しないままにしておくと、画面に出力が送信されます。標準エラー(またはstderr)は、ほとんどの障害とエラー状態をキャプチャするものです。

Stderrの許可拒否メッセージを「通常の出力」と同じ出力ストリームに渡すには、2つを組み合わせる必要があります。この例では、grep -vを適切に操作するために、stdout(標準出力)とstderrを表示される不可解な構文と組み合わせます。

GNU Bashマニュアル セクションから .2.2パイプライン

'|&'が使用されている場合、command1の標準エラーは、その標準出力に加えて、command2のパイプを介した標準入力。 2>&1 |の省略形です。この標準エラーの標準出力への暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。

また、geirhaが指摘しているように、stderrの出力を単に取り除きたい場合は、次のようなことをしたいでしょう

find -name 'myfile.*' 2> /dev/null

多分

find -name 'myfile.*' 2> /tmp/errorlog

また、findがその出力をxargsに渡すなど、コマンドの文字列がある場合は、コマンドのすべてのコンポーネントからの出力をキャプチャするために、コマンドパイプライン全体をかっこで囲む必要があります。例えば。、

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

括弧を省略し、代わりにこれを行った場合-

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

findまたはegrepからのアクセス許可拒否エラーが引き続き表示されますが、stderrはxargsにリダイレクトされます。

これまで見てきたように、テスト実行中に内容を表示した後にのみstderrを破棄する可能性があります。

GNU findと、私が知る限り、POSIX準拠のfindでは、-printオプションは暗黙的です。必要に応じて、明示的に指定することもできます。

24
belacqua

エラーメッセージは stderr に書き込まれ、 stdout 、ただし|パイプのみstdout

おそらく|&パイプstderrおよびstdout

10
Florian Diesch

エラーメッセージを無視する場合は、stderrを/ dev/nullにリダイレクトするだけです。

find . -name 'myfile.*' -print 2>/dev/null

また、 http://mywiki.wooledge.org/UsingFind を読むことを検討してください。

1
geirha