- 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
오류를 확인하는 것(및 오류에서 올바르게 복구하는 것)이 가장 잘 테스트된 코드 중 하나가 아닐 수 있기 때문입니다. 경로.
티슈는 좀 더 자연스러운 느낌을 주는 것을 사용하세요. 스크립트를 안전하고 친숙하게 만들고 싶다면 계층 구조를 합리적으로 유지하고 이상한 문자(및 공백)를 피하십시오. 이러한 제한은 상당히 관대합니다. 가까워지면 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 -l
819라고 나와 있었고 이미 총 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바이트로 제한됩니다. 꽤 많은 금액인데 너무 걱정할 필요는 없을 것 같아요. 좋은 정리를 위해서는 자신에게 가장 적합한 방식으로 정리하세요.