最近WindowsとMacでディレクトリ(フォルダ)名をちょっと整理しようと思って 大文字や小文字も統一したりしようとしたんですが、 なんか上手くいかない所があって、ちょっと調べたら 今更ながらWindowsやMacでは大文字小文字の区別をしないことを知ったので 一応その辺のまとめ。
Windows
最近のWindowsでは大概ディスクがNTFSにフォーマットされていると思いますが、 NTFS自体は大文字小文字を区別します。
どのシステムにフォーマットされてるかは各ディスクを
右クリック
プロパティ
で出てくる情報の
ファイルシステム
の項目にあります。
ただ、通常のWindowsシステムではアプリケーション側で 区別しないようになっています 1。
ですので通常はWindowsでは大文字小文字を区別しない、と言う状態です。
ためしにa.txt
と言うファイルがあるフォルダにA.txt
と言う新規ファイルを
作ろうとすると同じ名前があるからa(1).txt
にしますか、的な事を聞かれます。
ただし、2つを区別出来ない(同時には存在できない)のですが、 名前の大文字小文字情報自体は保存されます。
また、全角の文字同士(aとA等)でも区別されません。ただし 全角と半角は区別されるのでa.txtとa.txtは同時に存在できます。
Windowsで区別するにはレジストリーをいじったりすると出来るっぽいですが 2、特にWindowsだとウィルスやらスパイウェアの隠し所に なりやすいので滅多なことではしない方が良いとのこと。
また、Microsoft純正のUnix互換ツール, Windows Services for UNIX (SFU) 3, やWindows Server 4では大文字小文字を区別するオプションがあります。 が、この場合もセキュリティー面からはしない方が良いとのこと。
Mac
Macの場合も通常は区別しません。
初期のファイルシステムはMac OS拡張(HFS+)でこのシステム自体が区別しない様です。
使っているディスクを調べるには調べたいディスクをFinderで選んで
右クリック
(2本指クリック
)情報を見る
または⌘-iで出てくる情報のフォーマット
の欄を見ます。
手元にあるMac Book AirだとMac OS拡張(ジャーナリング)
となっていて、
このジャーナリングと言うのはファイルシステムの整合性を保護するための技術だそうです
5。
MacでディスクをフォーマットするときにMac OS 拡張(大文字/小文字を区別)
(HFSX)
も選べてこれらを選べば区別するようになります。
NFSとかに使う時はお勧めです
6、ということですが、
メインのディスクではこれらを選ぶとAdobeで問題がある様で
7
取り敢えず必要なければ避けた方が良さそうです。
Mac(HFS+)の場合も大文字ファイルと小文字ファイルは同じ物として扱われて 2つ同時に存在できませんが、その名前の情報自体は保存されます。 全角半角についてもWindowsの場合同様。
Linux
Linuxで良く使われるext3だと大文字小文字は区別されます。
調べるのはコマンドらいからdf -T
でType
の項を見ます。
Linuxで区別しないようなシステムを使いたい場合はfat32や ciopfsというのも使える様です 8。
Windows/Macで使っていたファイルをLinuxに持ってきて大文字小文字の違いで問題がある場合は この様なそもそも区別しないファイルシステムを使うか、 ファイル名等を全て変換してしまう必要があります 9 10。
コマンドライン
タブ補完
通常はタブ補完で大文字小文字を区別する様になっているので、 例えCygwinやMacで区別しないようになっていても 大文字ファイルがある所で小文字を押してタブを押しても補完されません。
区別しないようにするためには~/.inputrc
に
1
|
|
を加えます。
現在の状態は
bind -v|grep completion-ignore-case
でonかoffか見れます。
git mv
git mv
コマンドを使っている時に今回の話に気付いたわけなんですが、
git mv
は、大文字が区別される環境の場合、
$ git mv a.txt A.txt
と言った変換が可能ですが、cygwinやMacで区別されない環境だと このコマンドはA.txtは既に存在している、と言うことでエラーを出します。
従って、この場合ファイル名を大文字にしたい時は一時ファイルb.txt
等を介して
$ git mv a.txt b.txt
$ git mv b.txt A.txt
とします。
ちょっと混乱するのがgitコマンドを使わずに変更した場合で、
$ mv a.txt A.txt
として、
$ git add A.txt
$ git status
としても何も変化は見られず、さらにこの状態だと以下のような事が起こります。
$ ls
A.txt
$ git mv A.txt B.txt
fatal: not under version control, source=A.txt, destination=B.txt
$ ls
A.txt
$ git mv a.txt B.txt
$ ls
b.txt
つまり、git上では大文字小文字が区別されるのですが、
add
コマンドをした時、既に大文字小文字が違うが同じ名前の物が
登録されていると新たに登録されたり情報が更新されたりはしません。
従ってその後のgitコマンド上でのファイル操作がおかしなことになります。
Dropbox
Dropboxで同期しているファイル名等での大文字小文字変換は 基本的に伝播されないようです。 現在Linux上で動かしている物がないので区別されるシステム上で 変更したらどのように伝播するかは分かりませんが、 Windows/Mac間では伝播しませんでした。
また、ウェブインターフェースでは、Renameしようとすると、 一度は変わった様に見えるのですがリロードすると元に戻ります。
この場合、ウェブ上での表示を変更したい場合はgit mv
のとき同様
ローカルでもウェブ上でもいいので、一時ファイルを挟んで変更する必要があります。
この場合、ひとつの端末で
mv a b
mv b A
としてあげれば他の端末にも伝播するのですが、注意として、
この作業を一気にやってしまうと、他の端末に送られる命令が結局
a
A
になってしまうので、
ちょっと時間を置く必要があります(web及び他の端末でも一回b
になる時間が必要)。
実用上あまり問題が無いにしてもちょっとやっかいなので やはり最初からなるべくちゃんと決めて変更が無いようにしたいものです。
まとめ
区別しないとは言っても混乱を避けるために区別されても良いようにすべきだとは 思いますが、一応知っておかないとちょっとした所で思わぬ動きを見せるので 知っておいて損はないかと。
さらに詳しい情報や他のファイルシステムについては Wikipediaにまとまっています 11。