Em diretórios criados profundamente

6
  1. No Windows, há um certo limite no número de caracteres em um caminho, que restringe a profundidade que um diretório pode ser criado. Eu fui perguntando como é o caso no Linux?
  2. Você tem algumas sugestões sobre como organizar diretórios para alcançar os mesmos ou fechar benefícios suficientes (como bom para a organização) de estruturas de diretório profundas, com menos problemas potenciais um pode esbarrar?
por Tim 13.01.2012 / 06:01

3 respostas

20

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.

    
por 13.01.2012 / 07:04
2

AFAIK é o limite do comprimento do caminho definido em include / linux / limits.h e é de 4096 caracteres (incluindo o% finalNull -byte). O comprimento do nome do arquivo é limitado a 255 caracteres. No entanto, o sistema de arquivos real pode impor restrições adicionais.

    
por 13.01.2012 / 07:01
1

Eu apenas tentei um script simples para testar isso (na minha unidade ext4):

dir=test
while mkdir $dir; do dir=$dir/test; done

O erro que eventualmente deu foi File name too long . Eu usei find test | wc -l para obter a profundidade, ela disse 819, e eu já tinha 2 deep, para um total de 821. Então eu tentei com um nome de uma letra:

dir=a
while mkdir $dir; do dir=$dir/a; done

Morreu com a mesma mensagem File name too long em 2048 deep (2050 total).

Então eu tive a ideia de cd em cada diretório que eu fiz para que a linha de comando não crescesse:

while mkdir a; do cd a; done

Ainda está sendo executado e parece estar indo um pouco mais devagar que os outros dois, atualmente 2214.

Eu olhei para ele, e tudo que eu encontrei foi uma declaração (nota 14 na parte inferior) que o Linux tem um limite no nome do caminho de 4096 bytes. Isso é um pouco, e eu não acho que você precise se preocupar muito com isso. Quanto a boa organização, organize as coisas da maneira que mais lhe fizer sentido.

    
por 13.01.2012 / 07:01

Tags