まえがき
ファイル、文字列の検索はUnixの得意技である。
これはコマンドラインでやるべきだ。
ラインナップ(見つけたもの)
- locate
- find
- mdfind
- 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
で文字コードの一覧が見れる。