特定のパターンに一致するファイルを見つけようとしていますが、パターンに一致するはずのファイルがあるにもかかわらず、以下のコマンドを実行しようとすると結果が返されません。
find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;
.*/
パス全体に一致することはわかっていますが、それが正確に何を意味するのかよくわかりません。
一致する必要があるファイルには、例えば次のようなものがあります。
- s_choose_blue.png
- s_choose_red.png
- s_new_blue.png
答え1
正規表現の実際の問題は、一致すべきものと一致しないことです。分解すると次のようになります。
.*/
– 任意の文字を複数回繰り返し、その後にスラッシュを続けます。これは基本的に、実際のファイル名の前のディレクトリ リストを消費するため、文字通り一致します./
(例のように)。また./some/other/dir/
、最後のスラッシュまで一致します。これが機能するのは、正規表現がデフォルトで「貪欲」であるためです。つまり、可能な限り一致することを意味します。本質的には、この部分では、実際のファイル名のみを検索し、結果からパスを削除できます。
まとめると、
.*/
実際のファイル名だけを知りたい場合は正規表現の前に が必要です。ファイルへのパスの一部も一致させる必要がある場合は、 は使用できません。.*/
s_
– これはあなたの例ではうまく機能します[a-zA-Z]
– これは消費するだけです1つこのクラスのキャラクター_
– アンダースコアが続く[a-zA-Z]
– 再び続いて1つキャラクター\.png
– ドットと拡張子を文字通り一致させる
したがって、正規表現を次のように変更する必要があります。
.*/s_[a-zA-Z]+_[a-zA-Z]+\.png
を使用する必要があります+
。これは基本的に、前のものの 1 つまたは複数を意味します。