回答:
正規表現ではなく文字列が本当に必要であると仮定すると、 fgrepそして:
fgrep -rl --null desired_string . | xargs -0 fgrep -lv undesired_string --
再帰的に -r )grep desired_string 現在のディレクトリの下に、ファイル名を表示します( -l )とそれからのファイル名を使用して、(それを呼び出すときにコマンドライン引数のためのスペースをいっぱいにしないように)fgrepを繰り返し呼び出します。 -v 一致の意味を逆にします。
これは --null 改行文字の代わりに各ファイル名の後にASCII NUL文字を使用して、スペースを含むファイル名を扱うことができるようにします。それは -0 xargsに与えられます。 Unixの変種(Linux、BSDなど)によっては、次のような短い選択肢があるかもしれません。 --nullしかし、それは移植性が劣ります。厳密に言えば、 --null 移植性はありませんが、最近のシステムの(f)grepはそれを持っているはずです。
の -- 2番目の(f)grepの最後で、(f)grepが次のパラメータでオプションを探すのをやめます。 -それでもファイル名として処理されます。