IOリダイレクト

IOリダイレクト

重複バックアップ時に無視されるファイルとして入力される10Gを超えるファイルのリストを作成する必要があります。ただし、読み取り権限がないいくつかのファイルがあります。後で処理される項目は無視し、「許可拒否」メッセージなしでリストを整理したいと思います。

次のようにリストを作成できます。

$ find data/ -size +10G
/data/bigfile1
find: `/data/badfile1': Permission denied
find: `/data/badfile2': Permission denied
/data/bigfile2

次に、「Permission Denied」または「Looking for:」文字列を含む行を削除する必要があります。リスト出力の順序が関連しているかどうかはわかりませんが、私が見たのはそうです。複数のオプションを試していますが、線を削除できません。私はこの問題に従いますが、似ているようですが、なぜ動作しないのか理解できません。 https://stackoverflow.com/questions/3548453/negative-matching-using-grep-match-lines-that-do-not-contain-foo

まず、grepを使用してアプローチを試しています。

$ find data/ -size +10G | grep -v 'find:'
find: `/data/badfile1': Permission denied
/data/bigfile1
find: `/data/badfile2': Permission denied
/data/bigfile2

また、awkを使用して:

$ find data/ -size +10G | awk '!/find:/'
find: `/data/badfile1': Permission denied
find: `/data/badfile2': Permission denied
/data/bigfile1
/data/bigfile2

それにもかかわらず、肯定的な選択はうまく機能します。だから私は何をすべきかわかりません。

答え1

IOリダイレクト

問題はスクリプトにあるのではありません特徴UNIX IOリダイレクト。

次のコマンドを検討してください

find data/ -size +10G | grep -v 'find:'

stdoutストリームのみがパイプラインコマンドgrepに送信され、エラーメッセージは別の出力ストリームにありますstderr

したがって、ターミナルセッションにエラーメッセージが表示されても、ターミナルはコンソールと両方のコンソールにstdout印刷stderrされるため、grepコマンドは次のようになります。いいえ次の出力ラインを受け取ります。これは|、出力がリダイレクトされる方法によるものです。パイプは次のコマンドにのみ|接続されるため、次のコマンドには入りません。stdoutstdinstderr

ほとんどの*NIXユーティリティはこのように動作してエラーをstderr出力ストリームに送信するため、あなたと同じ状況でこれらのメッセージをフィルタリングする必要はありません。

テスト

stdout上記のコマンドが渡されたときに正確に何が起こるかを確認するには、grep次の手順を実行します。

find data/ -size +10G > out.txt

コンソールにはまだエラーが表示されますが、stdout出力ストリームは新しいファイルに移動しますout.txt。そこで見ると、エラーメッセージ行は表示されません。

関連情報