知っておくとちょっと便利!Linux の拡張子について2 (ちょっと深掘り)

今号では、Linux における「拡張子」について、ちょっと深掘りした内容をご説明します!
前号でご紹介した「知っておくとちょっと便利!Linux の拡張子について」もぜひご参照くださいね。

Linux がファイルの種類を判断する仕組み

前号で、Linux はファイルヘッダというファイルの情報を読み取り、どのようなファイルであるかを判断していると書きましたが、この部分をもう少し具体的に見ていきます。

ファイルの種類を調べたい場合は file コマンドを使用しますが、その際マジックファイルと呼ばれるファイル (/usr/share/file/magic) の情報を参照した上でファイルの種類を判断します。

なお、/usr/share/file/magic の内容は下記の様になっています (一部抜粋)。file コマンドのプログラムが、どのようにこれらの値を参照して最終的なファイルの種類を決定するか、その仕組みはかなり難解なので、別の機会にお話しできればと思います。

# RISC OS Chunk File Format
# From RISC OS Programmer's Reference Manual, Appendix D
# We guess the file type from the type of the first chunk.
0       lelong          0xc3cbc6c5      RISC OS Chunk data
>12     string          OBJ_            \b, AOF object
>12     string          LIB_            \b, ALF library

# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
16      lelong          0xef000011      RISC OS AIF executable

# RISC OS Draw files
# From RISC OS Programmer's Reference Manual, Appendix E
0       string          Draw            RISC OS Draw file data

# RISC OS new format font files
# From RISC OS Programmer's Reference Manual, Appendix E
0       string          FONT\0          RISC OS outline font data,
>5      byte            x               version %d
0       string          FONT\1          RISC OS 1bpp font data,
>5      byte            x               version %d
0       string          FONT\4          RISC OS 4bpp font data
>5      byte            x               version %d

# RISC OS Music files
# From RISC OS Programmer's Reference Manual, Appendix E
0       string          Maestro\r       RISC OS music file
>8      byte            x               version %d

>8      byte            x               type %d

# Digital Symphony data files
# From: Bernard Jungen (bern8817@euphonynet.be)
0               string  \x02\x01\x13\x13\x13\x01\x0d\x10        Digital Symphony sound sample (RISC OS),
>8              byte    x       version %d,
>9              pstring x       named "%s",
>(9.b+19)       byte    =0      8-bit logarithmic
>(9.b+19)       byte    =1      LZW-compressed linear
>(9.b+19)       byte    =2      8-bit linear signed
>(9.b+19)       byte    =3      16-bit linear signed
>(9.b+19)       byte    =4      SigmaDelta-compressed linear
>(9.b+19)       byte    =5      SigmaDelta-compressed logarithmic
>(9.b+19)       byte    >5      unknown format

0       string  \x02\x01\x13\x13\x14\x12\x01\x0b        Digital Symphony song (RISC OS),
>8      byte    x       version %d,
>9      byte    =1      1 voice,
>9      byte    !1      %d voices,
>10     leshort =1      1 track,
>10     leshort !1      %d tracks,
>12     leshort =1      1 pattern
>12     leshort !1      %d patterns

0       string  \x02\x01\x13\x13\x10\x14\x12\x0e
>9      byte    =0      Digital Symphony sequence (RISC OS),
>>8     byte    x       version %d,
>>10    byte    =1      1 line,
>>10    byte    !1      %d lines,
>>11    leshort =1      1 position
>>11    leshort !1      %d positions
>9      byte    =1      Digital Symphony pattern data (RISC OS),
>>8     byte    x       version %d,
>>10    leshort =1      1 pattern
>>10    leshort !1      %d patterns
…

Linux でよく使われる二重拡張子 (tar.gz 等)

tar.gz や conf.bak 等、Linux ではドットが連続する二重拡張子を使用することがあります。
これは、そのファイルにおける処理の履歴を表します。

例えば、下記の様な二重拡張子を持つファイルを見てみると…

  • .tar.gz: 複数のファイルを 1つにまとめた (.tar) ものを、圧縮した (.gz)。
  • .conf.bak: 設定ファイル (.conf) をバックアップとして残した (.bak)。
  • .log.1.gz: ログファイル (.log) の 1世代前をローテーション (.1) し、さらに圧縮した (.gz)。

それぞれこのような意味になります。

シバン (Shebang) の有無でファイルの種類が変わる!?

シバンとは、Linux においてスクリプトファイルの1行目に記述する #! で始まる特別な文字列です。
実はこれが、ファイル実行時における拡張子の代わりとなります。

例えば、下記の様なテキストファイル test.txt があるとします。file コマンドでファイルの種類を確認すると、当然テキストファイル (ASCII text) と判断されます。

# cat test.txt
echo "Hello"
# file test.txt
test.txt: ASCII text

ところが、test.txt に #!/bin/bash という文字列を追加してみると、拡張子を含めたファイル名はそのままに、ファイルの種類が変わっていることが分かります。

# cat test.txt
#!/bin/bash
echo "Hello"
# file test.txt
test.txt: Bourne-Again shell script, ASCII text executable

これは、マジックファイルの定義に基づき、ファイルの先頭に #!/bin/bash が追加された際にスクリプト (Bourne-Again shell script) と判断するルールがあるため、このような結果となります。

プログラムの 1行目に記載する #! は単なるコメントではなく、ファイルの種類を識別するためにも使用される重要な文字列であることが分かりますね。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です