Os limites reais podem depender do sistema de arquivos que você está usando e do kernel.
Para descobrir os limites de um determinado ponto de montagem, você pode usar getconf
(ex. para /
em minha máquina):
$ getconf PATH_MAX /
4096
$ getconf NAME_MAX /
255
PATH_MAX
é o comprimento total máximo, NAME_MAX
se for o nome do arquivo. Os limites do kernel estão em include/linux/limits.h
na fonte do kernel :
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
Para obter uma lista dos limites do sistema de arquivos, consulte Comparação dos sistemas de arquivos .
Os limites do sistema de arquivos determinam o nível máximo de aninhamento (se houver) para diretórios e, em seguida, o comprimento dos nomes de arquivos e diretórios para esse sistema de arquivos. Os limites do kernel determinam quanto tempo as cadeias que se referem a caminhos podem ser.
Você pode ter uma estrutura de aninhamento que exceda o limite PATH_MAX
. Mas você não poderá se referir a ele com um caminho totalmente qualificado do root. Você também deve esperar bugs de software estranhos se usar essas estruturas profundas, já que muitos códigos esperam caminhos para caber dentro de PATH_MAX
buffers, e verificar erros de ENAMETOOLONG
(e se recuperar corretamente deles) provavelmente não é um dos melhores. caminhos de código testados por aí.
Quanto à organização, basta usar o que parecer mais natural. Mantenha hierarquias razoáveis, evite caracteres estranhos (e espaços em branco) se você quiser ser seguro para scripts / amigável. Esses limites são bastante generosos. Se você chegar perto de PATH_MAX
, provavelmente é hora de reorganizar as coisas.
Se você quiser testar como as coisas se comportam em caminhos muito longos, aqui está uma maneira rápida de gerar caminhos enormes:
#! /usr/bin/perl
my $kd = "a" x 255;
for my $i (1..64) {
mkdir($kd); chdir($kd);
}
Se você quiser uma hierarquia profunda, tente com:
#! /usr/bin/perl
my $kd = "a";
for my $i (1..8192) {
mkdir($kd); chdir($kd);
}
E você pode obter:
$ pwd | wc -c
16394
Mas ksh
fica um pouco confuso:
$ cd ..
ksh: cd: ..: [File name too long]
bash
faz o cd ..
, mas o prompt está confuso, o nome do diretório não é resolvido - então pwd | wc -c
é realmente 16397 depois disso.