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で、区切り文字がないため、末尾のオプションはありません。

答え2

注文する

find ~user

改行文字を含む名前を含むすべての名前が検索されます。-type f一般的なファイルだけを探したい場合は、追加してください。

名前の一致を制限したくない場合は、名前のテストを使用しないでください。

部分文字列一致を使用して名前を制限するには、-nameテストでワイルドカードパターンを使用できます。*どちらも通常の?シェルとテストの両方-nameでワイルドカードパターンの改行と一致しますfind

標準を使用した例find:

$ find . -name 'file?name'
./file
name
$ find . -name 'file*name'
./file
name
$ find . -name 'd*name'
./dir
name
$ echo ./d*name
./dir
name

誤解された質問に対する回答(「改行文字を含む名前を見つける方法」):

使用標準find:

find ~user -name '*
*'

これをサポートするシェルでは、「C文字列」を使用してください(まだ標準を使用していますfind)。

find ~user -name $'*\n*'

GNUで一般的に使用できる組み込み正規表現タイプはfind改行文字と一致しないため、\n上記のワイルドカードパターンのようにリテラル改行文字のみを使用できます。これは-name、移植不可能なテストよりも標準的なテストを使用する方が-regex容易であることを意味する。

関連情報