それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MacのSpotLight検索をコマンドラインから使う(linux の locate)

MacのSpotLightをコマンドラインから使って検索したい。

SpotLightはとても便利です。検索インデックスを自動生成して、ファイルシステムには格納されていないデータを、メタデータとして保存してくれます。

メタデータを使うと検索がとても楽になりますね。

ターミナルからもSpotlightしたいです。

locate のためにupdatedbするの面倒だし。Findコマンド*1覚えるの面倒だから。スポットライトから検索できたら便利ですよね。


ターミナルからもSpotlight検索ができます。

ターミナルからスポットライトするために提供されているコマンドがあります。

の2つのコマンドを教えてもらいました。

mdfind コマンドで検索

mdfindコマンドは、SpotLightデータベースからファイルを探す

実行例

ターミナルを探してみました。

takuya@air:~$ mdfind terminal | grep app
/Users/takuya/Library/Preferences/com.apple.Terminal.plist
/Applications/Utilities/Terminal.app
/Developer/Documentation/Python/PyObjC/tutorials/firstapp.rst
/Users/takuya/Library/Preferences/SDMHelpData/AppleExtra/Japanese/HelpSDMIndexFile/com.apple.Terminal.help
/Users/takuya/Library/Saved Application State/com.apple.Terminal.savedState
/Users/takuya/Library/Preferences/com.apple.Terminal.plist.lockfile
/Users/takuya/Library/Caches/com.apple.Terminal
/Users/takuya/Library/Caches/com.apple.helpd/Generated/com.apple.Terminal.help

SpotligtのDBから検索する。事前インデックスが必要ですね。なのでfindよりmlocateに近いのかもしれませんね

mfindコマンドで詳細な条件を入れる

mfindコマンドはSptlightで使うような条件も入力できる。

たとえば「アプリケーション」を探してみます。

takuya@air:~$ mdfind  'kMDItemKind=="アプリケーション"'| head -n 20
/Applications/Remote Desktop Connection.app
/Applications/System Preferences.app
/Applications/Opera.app
/Applications/Preview.app
/Applications/VLC.app
/Applications/Coda.app
/Applications/App Store.app
/Applications/BBEdit.app
(ry

ターミナルをに絞ってみる

takuya@air:~$ mdfind  'kMDItemKind=="アプリケーション"'| grep Termi
/Applications/Utilities/Terminal.app

これで目的のアプリケーションが見つけられる。

写真を探す。

写真を探すことも出来ます。

kMDItemAcquisitionModelがカメラのモデルが格納されているカラム名です。

NECの携帯電話820Nで撮影した写真を探す

takuya@air:~$ mdfind "kMDItemAcquisitionModel==820*" | head
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0090.JPG
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0089.JPG
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0088.JPG
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0087.JPG
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0086.JPG
/Users/takuya/携帯バックアップ/DCIM/100NECDT/NEC_0085.JPG

kMDItemAcquisitionModelがカメラモデルの属性名だとわかったのかというとmdlsコマンドを使って属性名と属性値を知っているから。

mdlsコマンドで属性を列挙する。

lsの代わりのmdlsでファイルのメタデータが一覧できる。

写真が提供するメタデータの一覧を見る

mdlsコマンドで、ファイルのメタデータを見ることができる。

takuya@air:~/携帯バックアップ/DCIM/100NECDT$ mdls NEC_0001.JPG
kMDItemAcquisitionMake         = "NEC"
kMDItemAcquisitionModel        = "820N/821N"
kMDItemBitsPerSample           = 32
kMDItemColorSpace              = "RGB"
kMDItemContentCreationDate     = 2010-02-26 13:18:38 +0000
kMDItemContentModificationDate = 2010-02-26 13:18:38 +0000
kMDItemContentType             = "public.jpeg"
kMDItemContentTypeTree         = (
    "public.jpeg",
    "public.image",
    "public.data",
    "public.item",
    "public.content"
)
kMDItemDateAdded               = 2011-10-14 06:54:36 +0000
kMDItemDisplayName             = "NEC_0001.JPG"
kMDItemEXIFVersion             = "2.2"
kMDItemExposureMode            = 0
kMDItemFlashOnOff              = 0
kMDItemFNumber                 = 4
kMDItemFocalLength             = 3.4
kMDItemFSContentChangeDate     = 2010-02-26 13:18:38 +0000
kMDItemFSCreationDate          = 2010-02-26 13:18:38 +0000
kMDItemFSCreatorCode           = ""
kMDItemFSFinderFlags           = 0
kMDItemFSHasCustomIcon         = 0
kMDItemFSInvisible             = 0
kMDItemFSIsExtensionHidden     = 0
kMDItemFSIsStationery          = 0
kMDItemFSLabel                 = 0
kMDItemFSName                  = "NEC_0001.JPG"
kMDItemFSNodeCount             = 395663
kMDItemFSOwnerGroupID          = 20
kMDItemFSOwnerUserID           = 501
kMDItemFSSize                  = 395663
kMDItemFSTypeCode              = ""
kMDItemHasAlphaChannel         = 0
kMDItemKind                    = "JPEG イメージ"
kMDItemLogicalSize             = 395663
kMDItemOrientation             = 1
kMDItemPhysicalSize            = 397312
kMDItemPixelCount              = 1920000
kMDItemPixelHeight             = 1600
kMDItemPixelWidth              = 1200
kMDItemProfileName             = "sRGB IEC61966-2.1"
kMDItemRedEyeOnOff             = 0
kMDItemResolutionHeightDPI     = 72
kMDItemResolutionWidthDPI      = 72
kMDItemWhiteBalance            = 0


もちろん事前にSpotlightの対象になっていてインデックスされていることが必要ですよ。

便利な使い方。メタデータを抽出するコマンド

いままではJPEGのメタ情報をガチで読みに行ってた。これからは、SpotLightの事前インデックスを見ればらくになる。
JPEGメタデータ抽出が面倒だったのでこれは、手軽で便利!!

takuya@air:~/携帯バックアップ/DCIM/100NECDT$ mdls NEC_0001.JPG | grep -E "(PixelHeight|PixelWidth)”
kMDItemPixelHeight             = 1600
kMDItemPixelWidth              = 1200

おお便利。あとはこれをaliasにして活用すれば便利ですね。

検索インデックスを再構築するには

検索インデックス(索引)の再構成(reindex )をするには

sudo mdutil -i on /

これで次のようにインデックスが再度作り直されるので、検索インデックスが古くなったときに手動でやるといい。

大量にファイルを消したときやたくさんファイルを書き換えたときは手動でやるとトラブルがなくていい。再インストール時やデータ移行時など


多分他にもGUIとか launchctl からやる方法もあると思う。

2018-08-16 追記

検索インデックスの再構成について記述を追加した。


*1:bsdLinuxで方言が。。