MacのSpotLightをコマンドラインから使って検索したい。
SpotLightはとても便利です。検索インデックスを自動生成して、ファイルシステムには格納されていないデータを、メタデータとして保存してくれます。
メタデータを使うと検索がとても楽になりますね。
ターミナルからもSpotlightしたいです。
locate のためにupdatedbするの面倒だし。Findコマンド*1覚えるの面倒だから。スポットライトから検索できたら便利ですよね。
ターミナルからもSpotlight検索ができます。
ターミナルからスポットライトするために提供されているコマンドがあります。
- mdfind 検索
- mdls メタデータ閲覧
の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 追記
検索インデックスの再構成について記述を追加した。