「大文字と小文字の区別は、LinuxオペレーティングシステムではなくLinuxファイルシステムの機能です」とはどういう意味ですか?

「大文字と小文字の区別は、LinuxオペレーティングシステムではなくLinuxファイルシステムの機能です」とはどういう意味ですか?

次の文を読みました。

大文字と小文字の区別は、LinuxオペレーティングシステムではなくLinuxファイルシステムの機能です。

この文を使用してLinuxコンピュータを使用しているがWindowsファイルシステムでフォーマットされたデバイスを使用している場合、大文字と小文字の区別は問題にならないと推測されます。

これを確認するために、以下を試しました。

$ ~/Documents: mkdir Test temp

$ ~/Documents: touch Test/a.txt temp/b.txt

$ ~/Documents: ls te*
b.txt

tempLinuxファイルシステムを使用しているため、予想されるディレクトリ内のファイルのみを一覧表示します。

Windowsファイルシステム(注:WSL2を使用しています)に移動すると、まだ同じ結果が出ますが、大文字と小文字の区別を無視し、両方のディレクトリにファイルが一覧表示されることが予想されます。

$ /mnt/d: mkdir Test temp

$ /mnt/d: touch Test/a.txt temp/b.txt

$ /mnt/d: ls te*
b.txt

私はbashとzshの両方を試してみました。

ある意味ではbash(またはzsh)に関連しているようです。なぜなら、bashは大文字と小文字を区別しないファイルシステムを使用しても大文字と小文字を区別することを読んだからです。

テストはPowershellのため、ファイルシステムが実際に大文字と小文字を区別しないことを意味します。

答え1

ここで実行しています:

ls te*

機能の1つを使用してくださいシェルと言うワイルドカードまたはファイル名の生成(POSIXのパス名拡張子)は、LinuxシステムまたはLinuxで使用されるファイルシステムのパス名ではありません。

te*延長するシェルを通してこのパターンに一致するファイルのリストに移動します。

これを行うには、シェルはシステムの現在のディレクトリにあるエントリのリストを要求し(通常はシステム固有のreaddir()システムコール(Linuxの場合)を使用して、以下に説明するCライブラリの関数を使用してgetdents())各名前を比較します。パターンとして。

大文字と小文字を区別せずに一致するようにシェルを構成するか( .最初に報告されているように)拡張glob演算子のnocaseglobzshまたはbashのオプションを参照)、glob演算子を使用して大文字と小文字を区別しない限り(パス名解決はあるいは、デフォルトのファイルシステムは大文字と小文字を区別しないか、NTFSと同様に設定できます。(#i)zshte*readdir()te

答え2

〜のようにボイテック(Vojtech)の説明、NTFSは大文字と小文字を区別します。 FATファイルシステムで試してみるとうまくいきますが、ケース折りたたみバリアントを使用している場合にのみつまり msdosLinuxでは(WSLにこれに対応するものがあるかどうかはわかりません)。このFATバリアントの場合、ファイル名はすべて小文字Testなのでtest

ファイルシステムの大文字と小文字の区別に関して考慮すべきいくつかの側面があります。

  • ファイルシステム自体がケース情報を保存するかどうか
  • ファイルシステムの意図した使用が大文字と小文字を考慮しているかどうか
  • ファイルシステムドライバでもオペレーティングシステムマッピングの場合でも、つまり大文字と小文字を無視したファイルを見つけることはできますか?
  • どのようにイベントをマッピングします。

で実装された歴史的なFATは、msdos最初の2つの間のどこかにあります。技術的には、FATは大文字と小文字を格納できますが、実際にはそのようには使用されず、MS-DOSとそのレプリカは大文字と小文字を縮小します(したがって、および両方がreadme.txt有効なアクセス方法README.TXTです)。 Windows は、VFAT および NTFS を含む大文字と小文字の保存ファイルシステムでもこの動作を維持します。ファイルシステムドライバは、すべてのファイル名を小文字にマップすることによってこの問題を処理します。これはあまり正確ではなく、一貫した結果を生み出し、Unixスタイルのツールやユーザーの期待に関連する問題を回避します。したがって、Linuxでドライバを使用してファイルシステムをマウントすることは、上記のバリエーションを含むバリアントではなくアクセスできることを意味します。ReAdMe.TxTREADME.TXTmsdosmsdosREADME.TXTreadme.txt

あなたの引用はLinuxですコア少なくとも表面的にはそれ自体は特に心配しません。同じファイルを開くファイルシステムを想像できopen("README.TXT")ますopen("ReAdMe.TxT")。実際、XFSは少なくともASCIIファイル名に対してこのように設定できます(大文字と小文字は保持されますが、大文字と小文字を区別しないクエリを提供します)。しかし、一般的なシナリオでは、状況は急速に複雑になり、長年にわたり多くの議論がありました。ファイルシステムと大文字と小文字を区別しない大文字と小文字を区別しないファイルシステムの検索大文字と小文字を区別しないext4LWNから。

答え3

その理由はNTFSは大文字と小文字も区別します。、Windowsではユーザーにこれを隠します。 FATは大文字と小文字を区別しません。同じディレクトリにディレクトリを作成すると、testそれを確認できます。Test

$ ls
test
$ mkdir Test
mkdir: cannot create directory ‘Test’: File exists
$ mkdir TEST
mkdir: cannot create directory ‘TEST’: File exists

実際にはこれより少し複雑で、lsFATを使用してもテストは機能しません。ケース予約済み-- とディレクトリを作成することはできませんが、まだTest2つの場合(および間)testを区別するため、forとには両方の内容が一覧表示されません。T*t*ls t*testTemp

答え4

一つの点を指摘する価値があり、これはこれらの答えのいくつかをコンテキストに合わせることができます。

Linuxでは、ファイル名を処理するすべてのシステムコールはバイト文字列を処理します。つまり、プログラムがファイルシステムで何かを要求するたびに、使用中のすべてのファイル名をバイト文字列として指定し、返されるすべてのファイル名はバイト文字列になります。通常(必須ではありません)、これらの文字列にはASCIIまたはUTF-8でエンコードされたテキストが含まれ、大文字と小文字のバイナリ表現はこれらのエンコーディングとは異なります。したがって、ファイル名を「単なるバイナリデータ」として扱うすべての項目は大文字と小文字を区別します。

これらの要求がファイルシステムドライバに到達すると、一部のファイルシステムは大文字と小文字を区別してファイル名を解釈し(通常はLinuxまたは他のUnixオペレーティングシステムの場合)、一部のファイルシステムは大文字と小文字を区別せずにファイル名を解釈します。 (通常は他のタスクの場合)。 、Windowsのような)。ただし、これはプログラムが表示できない内部実装の詳細です。プログラムが見ることができるのはバイト文字列だけです。

通常、プログラムは実行中のファイルシステムが大文字と小文字を区別するかどうかを確認しようとしません。多くのプログラムはファイルシステムが大文字と小文字を区別することを暗黙的に想定しています(これが最も簡単なためです)。一部には大文字と小文字を扱うための設定オプションがありますが、すべてのファイルシステムがバイト文字列であるため、プログラムが表示するファイル名からそれを見つけることができないことに注意してください。

関連情報