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って意外と簡単だなと思えるようになりました。