findコマンドの正規表現に修飾子を使用しますか?

findコマンドの正規表現に修飾子を使用しますか?

ドット文字を使用して改行文字を一致させるために、findコマンドで正規表現を使用しようとしています。これは通常s修飾子を使用して行われます。ただし、正規表現エンジンによって形式が異なるため、findコマンドが改行と一致するように正規表現を作成する方法を正確に知ることはできません。たとえば、名前に改行を含むファイルを含むすべてのファイルと一致するように、次の簡単なコマンドをどのように変更しますか?

find /home/user -regex ".*"

私はこれを試してみましたが、"(?s).*"おそらく"/.*/s"他のいくつかを試してみました。

ベストアンサー1

私のバージョンのGNU findは、以下を使用して選択できるいくつかの正規表現バリアントをサポートしています-regextype

有効なタイプは、「findutils-default」、「awk」、「egrep」、「ed」、「emacs」、「gnu-awk」、「grep」、「posix-awk」、「posix-basic」、「posix- 「です。 「egrep」、「posix-extend」、「posix-minimal-basic」、「sed」。

ほとんどすべてがドットマッチ改行文字を作成します...を除いて、emacsこれがデフォルトです。

だから他のものを使用してください。posix-extended十分に正気であるかもしれません。

$ touch hello $'new\nline'
$ find . -type f -regex '.*'
./hello
$ find . -type f -regextype posix-extended -regex '.*'
./hello
./new?line

別のランニングを実行している場合は、findマイルが異なる場合があります。クイックテストの後、私のMacではデフォルトで改行文字と一致します.

繰り返しますが、単純なパターンでは、-namewhichを使用してシェルグローバル変数を取ることができます(そして改行の問題はあってはいけません)。

これはPCRE / Perl正規表現の機能のように見えますが、サポートされていません(?s)findの場合、生モードのみが/.*/s可能findで、区切り文字がないため、末尾のオプションはありません。

おすすめ記事