Spotlight
ファイル探すのを Spotlight に依存してるけど、見つからなかったりすることがたまによくあるのでちゃんと知識をえる
まとめ
- mdls をすると index されて(いる|いない)ことは判定できる
-
log show
log stream
などのログでは個別ファイルのインデックス状況を追うようなことはできない- mdworker のプロセスを activity monitor とかで見ればどのファイルを開いているかなどでファイルを読んでいる様子は観察できる
-
mdimport
で file を個別に index に入れることができmdimport -i
でディレクトリ内のファイルを index に入れることができる。
- よく検索するディレクトリを再検索するようにスクリプトにしておくといい。
過程
メモメモ
volume path って何
Spotlight の検索対象の一番大きな括りっぽい
mdutil -a -s
で確認できるっぽい。
/ とか /Volume/SSD001 とかそういうストレージデバイスのマウントポイントのことっぽい。
コマンドの構成?
mdutil -a -s
a は全部にっていう意味で、 s はステータスを見せてっていう意味で、 -a を -V /
とかして対象を変えることができる。 target 系のオプションと、 command 系のオプションに分かれると考えておけばいいかも。
でも
sudo mdutil -P /
のように target と command がセットになったようなコマンドもあるようだ。大文字のコマンドは volume 指定必須?のように見える。そういうコンセプトがあるかもしれない。
ログ見たい
log show --debug --info --predicate 'processImagePath ENDSWITH "/mds" OR processImagePath ENDSWITH "/mds_stores"' --start '2023-11-19 23:00:00'
とかやればいい。
predicate は NSPredicate というよく mac に組み込まれている情報をフィルタリングするための言語。 processImagePath CONTAINS[c] "mds"
のように [c]
とかやって演算子を拡張するのがキモい。
start とかで直近の時間を指定するといい
debug と info はより細かいろぐを見たいときに便利 debug だと出過ぎたら消せばいい
log stream --debug --info --predicate 'processImagePath ENDSWITH "/mds" OR processImagePath ENDSWITH "/mds_stores"'
のように show を stream にすれば tail -f みたいに sticky にログを見られる
どんな情報で絞れるかは
% log help predicates
valid predicate fields:
activityIdentifier (integer)
bootUUID (uuid)
category (string)
composedMessage (string)
continuousNanosecondsSinceBoot (integer)
creatorActivityIdentifier (integer)
creatorProcessUniqueIdentifier (integer)
date (date)
formatString (string)
logType (log type)
machContinuousTimestamp (integer)
parentActivityIdentifier (integer)
process (string)
processIdentifier (integer)
processImagePath (string)
processImageUUID (uuid)
sender (string)
senderImageOffset (integer)
senderImagePath (string)
senderImageUUID (uuid)
signpostIdentifier (integer)
signpostScope (signpost scope)
signpostType (signpost type)
size (integer)
subsystem (string)
threadIdentifier (integer)
timeToLive (integer)
traceIdentifier (integer)
transitionActivityIdentifier (integer)
type (event type)
このように見られる。
また
log stream --style json
みたいにすると json で見られるので predicate を書くと時にも便利
log を追う
一旦以下のコマンドで、 Path を保存している流れが見られる。パス名までは表示されない。 reverseStore というもの(多分、検索用の転置インデックスを保存してる DB)に、対して path を precache して commit して flush して、などの操作がわかる。
log stream --debug --info --predicate 'subsystem == "com.apple.spotlightindex" AND category == "Path"'
うーん。動いているということしかわからん。
reverseStore に関連する名前のファイルが Volume 直下の .Spotlight-V100 ディレクトリにも見られるので、そこに転置インデックスがあるんだろう。
他に
md
のつくコマンドを一通り man で読んでみた mdls
で null が出る場合は index されていない。 mdimport
で一ファイルだけとか、一ディレクトリだけとかインデックスできそう
mdimport /dir/filename
で、検索されなかったファイルが検索されるようになったことを確認できた。
mdimport -i /dir
で、ディレクトリ内の検索されなかったファイルが検索されるようになったことを確認できた。