重複バックアップ時に無視されるファイルとして入力される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
コマンドは次のようになります。いいえ次の出力ラインを受け取ります。これは|
、出力がリダイレクトされる方法によるものです。パイプは次のコマンドにのみ|
接続されるため、次のコマンドには入りません。stdout
stdin
stderr
ほとんどの*NIX
ユーティリティはこのように動作してエラーをstderr
出力ストリームに送信するため、あなたと同じ状況でこれらのメッセージをフィルタリングする必要はありません。
テスト
stdout
上記のコマンドが渡されたときに正確に何が起こるかを確認するには、grep
次の手順を実行します。
find data/ -size +10G > out.txt
コンソールにはまだエラーが表示されますが、stdout
出力ストリームは新しいファイルに移動しますout.txt
。そこで見ると、エラーメッセージ行は表示されません。