[Shell] findコマンドのパターンマッチングはテキスト的
findコマンドは、いろいろオプションがありすぎて、あまり深入りせずに適度に付き合ってきました。
ですが、ちょっとやりたいことがあって、いろいろいじっていたところ、基本的なことで勘違いしていることに気付きました。
今まで、例えば、_assets
という名前のディレクリだけを表示したいとき、次のように実行していました。
$ find . -type d -path '*_assets*'
./_assets
./_assets/images
./_assets/images/fc
./_assets/images/lowspeed
./_assets/images/rakuten
./_assets/images/run
./_assets/js
-pathオプションには-path '_assets'
でなく、-path '*_assets*'
と、アスタリスクで囲って指定してやらないと、なにもマッチされません。-path '_assets'
だとなにもヒットしないのです。
なんだか気持ち悪いけれど、そういうもの、ということで深入りしてませんでした。
ですが、いろいろいじってMANページ読んで、いまさら気付いたのです。これ、検索結果の文字列にマッチされているだけなんですね。ディレクトリ構造として認識して処理してるわけじゃない。
前述の例から条件を変えて、-path './_assets'
にして試してみると、
$ find . -type d -path './_assets'
./_assets
このように、完全にマッチした行だけ表示されます。
さらに、検索するディレクトリを.
ではなく、./
へ変更すると、
$ find ./ -type d -path './_assets'
# 結果なし
なにもヒットしなくなります。これは検索している場所は同じなのですが、実行結果のパスの表記が違ってくるのです。
$ find ./ -type d -path '*_assets*'
.//_assets
.//_assets/images
.//_assets/images/fc
.//_assets/images/lowspeed
.//_assets/images/rakuten
.//_assets/images/run
.//_assets/js
単純に、.//_assets
と./_assets
をテキストとしてマッチさせているだけなので、マッチしないから何もヒットしないのですね。表現の形式が違うだけで、同じディレクトリを示しているので、マッチするものだと思い込んでました。
となれば、こんなマッチングもできるはず。
$ find ./ -type d -path '*s/fc*'
.//_assets/images/fc
.//_site/assets/fc
/
はパスの区切りという思い込みがあったので、今までこんな発想はありませんでした。
単純にテキストとしてマッチさせているだけなので、findって意外と簡単だなと思えるようになりました。