🤓

意外に使えるfile command

2021/12/22に公開

file?

file はunix系のシステムに入っているファイルタイプを判別してくれるコマンド.
macOSにも入ってる.

$ man file
NAME
     file – determine file type

SYNOPSIS
     file [-bcdDhiIkLnNprsvz] [--exclude-quiet] [--extension] [--mime-encoding] [--mime-type]
          [-f namefile] [-m magicfiles] [-P name=value] [-M magicfiles] file
     file -C [-m magicfiles]
     file [--help]

usage

file <filename> でファイルの実態がなにかを教えてくれる.

$ file a.mov
a.mov: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT)
$ file a.mp4
a.mp4: ISO Media, MP4 Base Media v1 [ISO 14496-12:2003]
$ file b.png
b.png: PNG image data, 964 x 521, 8-bit/color RGBA, non-interlaced

画像系はファイルサイズや中のカラータイプなんかも表示してくれて便利.

例えば、nugetのnupkgや、androidのapkファイルは中身がzipファイルなのだけど、
fileコマンドを使うとそのことが見破れる.

$ file newtonsoft.json.13.0.1.nupkg
newtonsoft.json.13.0.1.nupkg: Zip archive data, at least v2.0 to extract, compression method=deflate
$ file /tmp/debug.apk
/tmp/debug.apk: Zip archive data, at least v0.0 to extract, compression method=deflate

あとは、ビルドした成果物が、どのアーキテクチャで実行可能なバイナリかを調べたりもできる.
iOSのビルドなんかでこの手法をよく使った.

$ file /usr/bin/c++
/usr/bin/c++: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/c++ (for architecture x86_64):	Mach-O 64-bit executable x86_64
/usr/bin/c++ (for architecture arm64e):	Mach-O 64-bit executable arm64e

なんかみたことないファイル拡張子だなとか、このファイルの中身どうなってるんだろう?
って気になった時はfileコマンドを使うと便利!

Discussion