回答:
正規表現ではなく文字列が本当に必要であると仮定すると、 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が次のパラメータでオプションを探すのをやめます。 -
それでもファイル名として処理されます。