mdfindでディレクトリを検索する
findでなくmdfindでディレクトリを検索したかったので調べてみた。
あの日,mdfind が見つけたもの
Spotlight syntax, mdfind examples, and metadata attributes
Spotlight Metadata Attributes
mdfind(1)
File Metadata Query Expression Syntax
上記のサイトを一通り見れば大体わかると思う。mdfindで使えるメタデータやクエリの記述方法はわかった。
mdlsでいくつかディレクトリのメタデータを見てみたのだけど、ディレクトリによって全然違っていた。
大体これでディレクトリと判定できるだろう、という条件が見つけられたので以下のようなクエリを使うことに。
$ mdfind 'kMDItemContentType == "public.folder" || kMDItemFSNodeCount > 0'
kMDItemContentTypeにpublic.folderが入っているディレクトリはこれで見つけられる。 kMDItemFSNodeCountは配下にファイルやディレクトリをいくつ持っているかという値らしく、 kMDItemContentTypeが指定されていない場合はこちらで見つけられる。
.gitディレクトリ配下にkMDItemContentTypeにpublic.folderが指定されておらず、kMDItemFSNodeCountも0のディレクトリがあるにはあったが……
これをpecoと組み合わせていい加減にディレクトリを移動したかったので、.bashrcに以下のような関数を書いた。
mcd() { cd "$(mdfind -onlyin $HOME 'kMDItemContentType == "public.folder" || kMDItemFSNodeCount > 0' | peco --query="$*")" }
ただ、mdfindは隠しディレクトリ配下をデフォルトでは検索してくれない。なので、findを使う関数も書いた。
icd() { cd "$(find $HOME -maxdepth 20 -type d -print 2>/dev/null | peco --query="$*")" }
これなら$HOME配下のディレクトリを大体検索してくれる。
上に書いたスクリプトをそのまま使ったのでなく、.gitやnode_modulesなど各種ディレクトリを無視するスクリプトを書いたので実際にはもう少し長いスクリプトになったが。
まだまだターミナル内でのディレクトリの移動や、Vimでのファイルの開き方には改善の余地があると思っているのでもっと楽にしていきたい。













