深く作成されたディレクトリに

深く作成されたディレクトリに
  1. Windowsでは、パス内の文字数には特定の制限があり、これはディレクトリを作成できる深さを制限します。 Linuxで状況がどうなのか知りたいです。
  2. 直面する可能性のある問題を軽減しながら、深いディレクトリ構造と同じまたは十分な利点(組織に適しているなど)を達成するためにディレクトリを構成する方法についていくつかの提案がありますか?

ベストアンサー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でした。

おすすめ記事