Linuxは255バイトより長いファイル名をどの程度サポートしていますか?

Linuxは255バイトより長いファイル名をどの程度サポートしていますか?

Linuxの255バイトファイル名の制限についてお問い合わせください。昨日の答えは、これが簡単に変更できない、または変更できない制限です。ただし、ほとんどのLinuxでは、最大ファイル名長が255 UTF-16文字のNTFSをサポートしていることを覚えています。

そこでNTFSパーティションを作成し、UTF-8で480バイトの160文字の日本語文字列でファイル名を指定しようとしました。うまくいかないと思っていましたが、下図のように動作しました。ファイル名が480バイトの場合、どのように機能しますか? 255バイト制限は特定のファイルシステムにのみ適用されますか? Linuxはデフォルトで255バイトより長いファイル名を処理できますか?

ここに画像の説明を入力してください。

----追信-----

文字列の始まりは次のとおりです。有名な日本古代文献「首都院長の本」。これは文字列です。

ゆく河の流れは极えずして、いいももとの水にあなりず。よどmilに float取り除きます。 世中にあRU人とsumikaと、またなakuのごとましたましきの街のうちに、尾根とべ、甍を競争にへRU、高い木、謙虚なしき、人の生まひは、 세상을 거쳐 takekiせないものであるが、とれをまとなと看ぬれれば、西ありしfamilyは珍しくなる。

使ったこのWebアプリケーションUTF-8バイトを計算します。

ここに画像の説明を入力してください。

答え1

答えは通常「状況によって異なります」です。

特に、最大ファイル名の長さを255として報告するNTFSの実装statvfsしたがって、呼び出し側はNTFSで有効なファイル名を回避するために255バイトの制限として解釈できます。ただし、ほとんどのプログラムは、これを事前に確認せずに(確認さえせずに)エラーをキャッチするためにエラーにNAME_MAX依存しています。ENAMETOOLONGほとんどの場合、重要な制限は、ファイル名を操作するときに通常バッファを割り当てるのに使用されるわけではないことPATH_MAXですNAME_MAX(オペレーティングシステムが期待どおりにパスバッファを動的に割り当てないプログラムの場合)。ハード任意の制限なし)。

NTFS実装自体は、ファイル名の長さ(バイト)を解決しませんが、常に255個の2バイト要素の配列で表示できない2バイト文字を識別するとエラーになりますENAMETOOLONG

NTFSは通常、LinuxのFUSEドライバによって処理されます。カーネルドライバ現時点ではUCS-2文字のみがサポートされていますが、ヒューズドライバUTF-16代理ペアをサポートします(文字の長さはそれに応じて短くなります)。

答え2

ファイル名の長さの制限は、実際にはファイルシステム内でエンコードされますext4https://en.wikipedia.org/wiki/Ext4:

最高。ファイル名長255バイト

~からhttps://en.wikipedia.org/wiki/XFS:

最高。ファイル名長255バイト

~からhttps://en.wikipedia.org/wiki/Btrfs:

最高。ファイル名長ASCII文字255文字(Unicodeなどのマルチバイト文字エンコードの場合は短い)

~からhttps://en.wikipedia.org/wiki/NTFS:

最高。ファイル名長255 UTF-16コード単位

多くのファイルシステムに対するこれらの制限の概要は、以下で確認できます。https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits。ここでは、ReiserFSの制限が高くなりますが(ほぼ4K)、カーネル自体(カーネル仮想ファイルシステムであるVFSの内部)の制限は255バイトであることがわかります。

テキストは、NTFSで使用される160個のUTF-16文字を使用します。

echo ゆく河の流れは絶えずして、しかももとの水にあらず。よどみに浮かぶうたかたは、かつ消えかつ結びて、久しくとどまりたるためしなし。世の中にある人とすみかと、またかくのごとし。たましきの都のうちに、棟を並べ、甍を争へる、高き、卑しき、人の住まひは、世々を経て尽きせぬものなれど、これをまことかと尋ぬれば、昔ありし家はまれなり。 > jp.txt
iconv -f utf-8 -t utf-16 jp.txt > jp16.txt
ls -ld jp*.txt
cat jp16.txt | hexdump -C

これは、0x140 = 320バイト(使用されている場合は2バイトの先行バイト順序表示(BOM)を追加)を示します。つまり、UTF-16文字は160文字なので、NTFSのUTF-16文字制限である255文字未満ですが、255バイトを超えています。

(ここでは改行は無視されます。)

答え3

だから私が見つけたのは次のとおりです。

コアツールファイル名の長さに特に注意を払わず、長さに関係なくユーザー入力を処理します(例:0チェック)。

つまり、次のように動作します(ファイル名の長さは462バイトです!)。

name="和総坂裁精座回資国定裁出観産大掲記労。基利婚岡第員連聞余枚転屋内分。妹販得野取戦名力共重懲好海。要中心和権瓦教雪外間代円題気変知。貴金長情質思毎標豊装欺期権自馬。訓発宮汚祈子報議広組歴職囲世階沙飲。賞携映麻署来掲給見囲優治落取池塚賀残除捜。三売師定短部北自景訴層海全子相表。著漫寺対表前始稿殺法際込五新店広。"
cd /mnt/ntfs
touch "$name"

これすら効果がある

echo 123 > "$name"
cat "$name"
123

ただし、上記のファイルを古典的なLinuxファイルシステムにコピーしようとすると、操作は失敗します。

cp "$name" /tmp
cp: cannot stat '/tmp/和総坂裁精座回資国定裁出観産大掲記労。基利婚岡第員連聞余枚転屋内分。妹販得野取戦名力共重懲好海。要中心和権瓦教雪外間代円題気変知。貴金長情質思毎標豊装欺期権自馬。訓発宮汚祈子報議広組歴職囲世階沙飲。賞携映麻署来掲給見囲優治落取池塚賀残除捜。三売師定短部北自景訴層海全子相表。著漫寺対表前始稿殺法際込五新店広。': File name too long

つまり、cp実際にこのファイルを生成しようとしましたが、ファイル名が255バイトを超えることを許可しません。/tmp/tmp

また、このファイルをマウスパッド(GTKアプリケーション)で開いて編集して保存することもできました。これはすべてうまくいきます。これは、255バイトの制限が一部のLinuxファイルシステムにのみ適用されることを意味します。

だからといって、すべてのことが順調に進むわけではありません。たとえば、私のお気に入りのコンソールファイルマネージャであるMidnight CommanderはNorton Commanderのレプリカです。できないリスト(ファイルサイズを0としてマーク)、このファイルを開く、またはアクションを実行します。

Error
No such file or directory (2)

答え4

ただし、ほとんどのLinuxでは、最大ファイル名長が255 UTF-16文字のNTFSをサポートしていることを覚えています。

ファイル名の長さやパス名の長さについて話していますか?

NTFSパス名の最大長は常に64Kバイト(= 32K UTF-16コードポイント)です。

Win32 APIは(編集者の意見)愚かなプログラマーが宣言を好むchar filename[MAX_PATH]が、その周辺に構文上の混乱があるため、より厳しい制限を適用します。

関連情報