主に、コマンドが失敗する原因となるファイル名のスペースを処理するために、bash コマンドでバッククォート内の文字をエスケープしようとしています。
私がこれまで持っているコマンドは次のとおりです。
grep -Li badword `grep -lr goodword *`
このコマンドは、単語「badword」を含まないが「goodword」を含むファイルのリストを生成する必要があります。
主に、コマンドが失敗する原因となるファイル名のスペースを処理するために、bash コマンドでバッククォート内の文字をエスケープしようとしています。
私がこれまで持っているコマンドは次のとおりです。
grep -Li badword `grep -lr goodword *`
このコマンドは、単語「badword」を含まないが「goodword」を含むファイルのリストを生成する必要があります。
エスケープを正しく行ったとしても、 によって出力されるファイルの数がgoodword
grep
コマンド ラインの長さの制限に達すると、問題が発生します。このように、最初の出力をgrep
2 番目の出力にパイプすることをお勧めします。grep
grep -lr -- goodword * | xargs grep -Li -- badword
これはスペースを含むファイルを正しく処理しますが、ファイル名に改行が含まれていると失敗します。少なくとも GNUgrep
とxargs
、このようにファイル名を NUL バイトで区切るサポート
grep -lrZ -- goodword * | xargs -0 grep -Li -- badword
編集: 一部のファイル名が で始まり、追加のオプションとして解釈される場合を回避するために、呼び出しに二重ダッシュ--
を追加しました。grep
-
grep
次のように書き直してはどうでしょうか。
grep -lr goodword * | grep -Li badword