macOS検索系コマンドまとめ

まえがき

ファイル、文字列の検索はUnixの得意技である。
これはコマンドラインでやるべきだ。

ラインナップ(見つけたもの)

  1. locate
  2. find
  3. mdfind
  4. grep

locate

locate用のデータベース(/var/db/locate.database)があって、そのデータベースを検索する。

$ locate xxx

データベースは初めは存在しない。自ら生成する必要がある。

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

定期的に更新も必要。
Macであれば mdfind を使った方が良い。

find

事前にデータベース化されたものではなく、今から調べて見つけるコマンド。

$ find xxx expr

xxxに対象ディレクトリ、exprに検索条件を指定する。

検索条件色々

  • 名前(-name)
  • パス(-path)
  • 正規表現(-regex)
  • ファイル種別(-type)
  • ファイル属性(所有者、作成・更新日時など)
  • 論理演算(and, or, not)組み合わせられる

などなど、多い。
全部調べに行くので、条件次第では時間がかかる。

mdfind

SpotlightのCUI。インデックスされたメタデータ検索なので、速い。あと、ファイル中身や属性情報も検索する(はず)。

$ mdfind xxx

オプション色々

  • 監視(-live)
  • ディレクトリ指定(-onlyin)
  • ファイル名指定(-name)

xxx には属性マッチも指定できるみたい

mdfind "kMDItemAuthor == '*MyFavoriteAuthor*'"

属性の一覧は mdimportで見れる

$ mdimport -X

mdlsで指定のファイルの属性情報を表示

$ mdls xxx

grep

ファイルの中身を検索する。

$ grep regex xxx

xxxは対象ファイル。regexは検索条件の正規表現。
xxxがディレクトリなら、ディレクトリ以下の全てのファイルが対象。
xxxなしなら、標準入力になる(パイプ用)。

オプション色々

  • サブディレクトリも対象とする(-r)
  • 条件に一致しないものを検索する(-v)
  • 大文字小文字を区別する(-i)
  • 検索結果の出力
    • 行番号を表示する(-n)
    • ファイル名のみを表示する(-l)
    • ファイル名を表示しない(-h)

おまけ

コマンドのフルパスを表示する。

$ which xxx

日本語の扱いについて

Macでは、日本語ファイル名の濁点・半濁点は別々の文字として扱われている。
そのため、そのままファイル検索すると引っかからない。
もし検索できなかったら、変換する必要がある。

iconv を使う

$ echo がめら | iconv -f utf-8 -t utf-8-mac

iconv -lで文字コードの一覧が見れる。


See also