깊게 생성된 디렉토리에

깊게 생성된 디렉토리에
  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오류를 확인하는 것(및 오류에서 올바르게 복구하는 것)이 가장 잘 테스트된 코드 중 하나가 아닐 수 있기 때문입니다. 경로.

티슈는 좀 더 자연스러운 느낌을 주는 것을 사용하세요. 스크립트를 안전하고 친숙하게 만들고 싶다면 계층 구조를 합리적으로 유지하고 이상한 문자(및 공백)를 피하십시오. 이러한 제한은 상당히 관대합니다. 가까워지면 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이었습니다.

답변2

AFAIK는 include/linux/limits.h에 정의된 경로 길이 제한으로, 4096자(마지막 Null바이트 포함)입니다. 파일 이름 길이는 255자로 제한됩니다. 그러나 실제 파일 시스템에서는 추가 제한이 적용될 수 있습니다.

답변3

방금 이것을 테스트하기 위해 간단한 스크립트를 시도했습니다(내 ext4 드라이브에서).

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

최종적으로 발생하는 오류는 입니다 File name too long. 예전에는 깊이를 구했는데 find test | wc -l819라고 나와 있었고 이미 총 821에 달하는 2 깊이입니다. 그런 다음 알파벳 이름을 사용해 보았습니다.

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

File name too long동일한 메시지를 사용하여 깊이 2048(총 2050)에서 실행되었습니다.

cd그런 다음 명령줄이 커지지 않도록 내가 만드는 모든 디렉터리로 이동하려고 생각했습니다 .

while mkdir a; do cd a; done

여전히 실행 중이며 다른 두 개(현재 2214)보다 훨씬 느린 것 같습니다.

나는 그것을 조사했고 내가 찾은 것은성명서(하단 참고 14) Linux에서는 경로 이름이 4096바이트로 제한됩니다. 꽤 많은 금액인데 너무 걱정할 필요는 없을 것 같아요. 좋은 정리를 위해서는 자신에게 가장 적합한 방식으로 정리하세요.

관련 정보