- Windowsでは、パス内の文字数には特定の制限があり、これはディレクトリを作成できる深さを制限します。 Linuxで状況がどうなのか知りたいです。
- 直面する可能性のある問題を軽減しながら、深いディレクトリ構造と同じまたは十分な利点(組織に適しているなど)を達成するためにディレクトリを構成する方法についていくつかの提案がありますか?
ベストアンサー1
実際の制限は、使用しているファイルシステムとカーネルによって異なります。
利用可能な特定のマウントポイントの制限を確認するにはgetconf
(例/
:マイコンピュータ):
$ getconf PATH_MAX /
4096
$ getconf NAME_MAX /
255
PATH_MAX
最大合計長です(NAME_MAX
ファイル名の場合)。カーネルの制限はinclude/linux/limits.h
次のとおりです。カーネルソースコード:
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
ファイルシステムの制限事項のリストについては、以下を参照してください。ファイルシステムの比較。
ファイルシステム制限は、ディレクトリ(存在する場合)の最大ネストレベルと、そのファイルシステムのファイル名とディレクトリ名の長さを指定します。カーネル制限は、パスを参照する文字列の長さを決定します。
実際には、制限よりも多くの入れ子構造を持つことができますPATH_MAX
。ただし、ルートから始まる完全修飾パスを使用してこれを参照することはできません。さらに、これらの深層構造を使用すると、奇妙なソフトウェアのバグが発生する可能性があります。多くのコードは、パスがPATH_MAX
バッファに収まると予想し、ENAMETOOLONG
エラーをチェックすること(およびエラーから正しく回復すること)が最もよくテストされたコードの1つではない可能性があるためです。パス。
ティッシュはより自然な感じを与えるものを使用してください。スクリプトを安全でフレンドリーにしたい場合は、階層を合理的に保ち、奇妙な文字(およびスペース)を避けてください。これらの制限はかなり寛大です。近づくとPATH_MAX
また集まる時間になるかもしれません。
非常に長いパスで物事がどのように機能するかをテストしたい場合は、巨大なパスを作成する簡単な方法があります。
#! /usr/bin/perl
my $kd = "a" x 255;
for my $i (1..64) {
mkdir($kd); chdir($kd);
}
深い階層が必要な場合は、以下を試してください。
#! /usr/bin/perl
my $kd = "a";
for my $i (1..8192) {
mkdir($kd); chdir($kd);
}
そして、以下を得ることができます:
$ pwd | wc -c
16394
しかし、ksh
少し混乱しています。
$ cd ..
ksh: cd: ..: [File name too long]
bash
実行されましたが、cd ..
プロンプトが混乱してディレクトリ名が解決されなかったので、それpwd | wc -c
以降は実際には16397でした。