読者です 読者をやめる 読者になる 読者になる

新潟の空は今日も灰色

技術ネタ中心にいきたいけど、そんなにネタは持ってません。

Mac のファイル名に使える文字列にびっくりした話

仕事中のこと

仕事では Mac を使っています。

ある日、エクセル*1でファイルを保存しようと思ったときに、なにを思ったか、こんな感じで保存したんです。まあ、Windows とかと同じ感覚で、どうせはじかれるだろうと思っていたんですが*2

f:id:hagane:20140605193242p:plain

ちょっとまって、保存出来てしまったけど、Mac って /(スラッシュ)を含むファイル名保存出来るの?!

ターミナルではどうなるのか

こうなると、よくわからないのは、ターミナルでの扱い。iTerm2 を立ち上げ保存したディレクトリに移動して、ls したらこうでした。

f:id:hagane:20140605193810p:plain

/ だったところが : になってる!二度びっくりです。

これは、本当にコロンなのか?

ファイル名の文字コードとか、ファイルシステムを直接いじれるならその方がいいんでしょうけど、そんな技量今の僕にはないので、とりあえずプログラムから触ったときに、この文字列がなんであるのかを確かめてみました。

Python 2.7.5 (default, Mar  9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.listdir('.')[0]
2014:06:05.xlsx
>>> for i in os.listdir('.')[0]:
...     print i, ord(i)
...
2 50
0 48
1 49
4 52
: 58
0 48
6 54
: 58
0 48
5 53
. 46
x 120
l 108
s 115
x 120
>>>

ASCIIの58は確かに : ですね*3

ふーむ。

これが許されているのは歴史的経緯?

ちょっと調べてみると、BSD ベースになる前の Mac のディレクトリ区切り記号は : だったようですね*4。その当時は、スラッシュはファイル名を構成する文字列として許されていたのでしょう。つまりこれは後方互換性のための措置なんですね。

どうやら、システム内部では : として扱い、Finder で表示するときに / に置き換えている模様。保存した瞬間結構びっくりしたんですけど、すごい仕様ですね。

ですので、bash から / を含む文字列を作ることはできません。bash:をファイル名に含むファイルを作った場合は、Finder 上では、/ に置き換えられて表示されます。

このスラッシュ入り(コロン入り?)ファイル名、Mac 上では閲覧・確認・保存等出来ますが、他のファイルシステムではたぶんだめです。Windows でやったらたぶん怒られます。今のところ、Windows あんまり触れないので確かめられてないんですが、共有しようとしたらなんかしらのトラブルになると思います。というか、Windows で直接 : の入ったファイル名をつけようとしたら怒られました。

Linux: 入りは大丈夫でした(/ は当たり前だけどだめぽ)。GUI 環境のある Linux 環境が今手元にないので、そっちでの表示のされ方は不明ですが、普通に考えれば : のままで出てきて欲しいところです。

というわけで、出来る限りこういう文字列をファイル名を入れるのはやめましょうね、というお話でした。

... もしかして常識でしたか?!

*1:別にエクセルじゃなくてもいいです。

*2:ATOK で「今日」って打鍵して入力した次第。「今日」って打ったときに、「2014-06-05」とかに変換出来ればいいのに…と思って確かめてみたら出来るじゃん!便利!

*3:ASCII文字コード : IT用語辞典

*4:ファイル名のスラッシュとコロン - onumeraneの日記 - mdsg。内容的にも今回の内容とほぼ同じものを書かれている方がいたんですね。