나Linux의 255바이트 파일 이름 제한에 대해 문의하세요.어제 답변은 이것이 쉽게 변경할 수 없거나 변경할 수 없는 제한 사항이라는 것이었습니다. 그러나 대부분의 Linux는 최대 파일 이름 길이가 255 UTF-16 문자인 NTFS를 지원한다는 것을 기억합니다.
그래서 NTFS 파티션을 만들고 UTF-8에서 480바이트의 160자 일본어 문자열로 파일 이름을 지정하려고 했습니다. 작동하지 않을 것이라고 예상했지만 아래 그림과 같이 작동했습니다. 파일 이름이 480바이트인 경우 어떻게 작동하나요? 255바이트 제한은 특정 파일 시스템에만 적용됩니까? Linux는 기본적으로 255바이트보다 긴 파일 이름을 처리할 수 있습니까?
----추신-----
문자열의 시작은 다음과 같습니다.유명한 일본 고대 문헌 "수도원장의 책". 이것은 문자열입니다.
ゆKU河の流れは极えずして、しいももとの水にあなりず.よどmilに float kataは, kataつ는 えikaつ 매듭 びて, 久しkuとどmariためしなし를 제거합니다.世の中にあRU人とsumikaと, またなakuのごとましたましkiの도시노우ちに, 능선과 べ, 甍を 경쟁 へRU, 높은 木, 겸손한 しki, 人の生まひは, 世々を経てtakekiせぬものなれど、とれをまとなと看ぬれば、西ありしfamilyはまれなり.
나는 사용했다이 웹 애플리케이션UTF-8 바이트를 계산합니다.
답변1
대답은 대개 "상황에 따라 다릅니다."입니다.
특히 최대 파일 이름 길이를 255로 보고하는 NTFS 구현statvfs
따라서 호출자는 이를 NTFS에서 유효한 파일 이름을 피하기 위해 255바이트 제한으로 해석할 수 있습니다. 그러나 대부분의 프로그램은 이를 미리 확인하지 않고(심지어 확인조차 하지 않고 ) 오류를 잡기 위해 오류 NAME_MAX
에 의존합니다 . ENAMETOOLONG
대부분의 경우 중요한 제한은 파일 이름을 조작할 때 일반적으로 버퍼를 할당하는 데 사용되는 PATH_MAX
것이 아니라는 것입니다 NAME_MAX
(운영 체제가 예상하는 대로 경로 버퍼를 동적으로 할당하지 않는 프로그램의 경우).허드임의의 제한 없이).
NTFS 구현 자체는 파일 이름 길이(바이트)를 확인하지 않지만 항상 255개의 2바이트 요소 배열로 표시할 수 없는 2바이트 문자를 확인하면 오류가 발생합니다 ENAMETOOLONG
.
NTFS는 일반적으로 Linux의 FUSE 드라이버에 의해 처리됩니다.커널 드라이버현재는 UCS-2 문자만 지원되지만퓨즈 드라이버UTF-16 대리 쌍을 지원합니다(문자 길이는 이에 따라 감소됨).
답변2
파일 이름 길이에 대한 제한은 실제로 파일 시스템 내에서 인코딩됩니다 ext4
.https://en.wikipedia.org/wiki/Ext4:
최고. 파일 이름 길이 255바이트
~에서https://en.wikipedia.org/wiki/XFS:
최고. 파일 이름 길이 255바이트
~에서https://en.wikipedia.org/wiki/Btrfs:
최고. 파일 이름 길이 ASCII 문자 255자(유니코드와 같은 멀티바이트 문자 인코딩의 경우 더 짧음)
~에서https://en.wikipedia.org/wiki/NTFS:
최고. 파일 이름 길이 255 UTF-16 코드 단위
많은 파일 시스템에 대한 이러한 제한 사항에 대한 개요는 다음에서 확인할 수 있습니다.https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits. 여기에서 ReiserFS의 제한이 더 높지만(거의 4K) 커널 자체(커널 가상 파일 시스템인 VFS 내부)의 제한은 255바이트임을 알 수 있습니다.
텍스트는 NTFS에서 사용되는 160개의 UTF-16 문자를 사용합니다.
echo ゆく河の流れは絶えずして、しかももとの水にあらず。よどみに浮かぶうたかたは、かつ消えかつ結びて、久しくとどまりたるためしなし。世の中にある人とすみかと、またかくのごとし。たましきの都のうちに、棟を並べ、甍を争へる、高き、卑しき、人の住まひは、世々を経て尽きせぬものなれど、これをまことかと尋ぬれば、昔ありし家はまれなり。 > jp.txt
iconv -f utf-8 -t utf-16 jp.txt > jp16.txt
ls -ld jp*.txt
cat jp16.txt | hexdump -C
이는 0x140 = 320바이트(사용된 경우 2바이트 선행 바이트 순서 표시(BOM) 추가)를 표시합니다. 즉, UTF-16 문자가 160자이므로 NTFS의 UTF-16 문자 제한인 255자보다 작지만 255바이트를 초과합니다.
(여기서 줄바꿈은 무시됩니다.)
답변3
그래서 제가 찾은 것은 다음과 같습니다.
핵심 도구파일 이름 길이에 특별히 신경 쓰지 말고 길이에 관계없이 사용자 입력을 처리하십시오(예: 0 검사).
즉, 다음과 같이 작동합니다(파일 이름 길이는 462바이트입니다!).
name="和総坂裁精座回資国定裁出観産大掲記労。基利婚岡第員連聞余枚転屋内分。妹販得野取戦名力共重懲好海。要中心和権瓦教雪外間代円題気変知。貴金長情質思毎標豊装欺期権自馬。訓発宮汚祈子報議広組歴職囲世階沙飲。賞携映麻署来掲給見囲優治落取池塚賀残除捜。三売師定短部北自景訴層海全子相表。著漫寺対表前始稿殺法際込五新店広。"
cd /mnt/ntfs
touch "$name"
이것조차 효과가 있다
echo 123 > "$name"
cat "$name"
123
그러나 위 파일을 클래식 Linux 파일 시스템에 복사하려고 하면 작업이 실패합니다.
cp "$name" /tmp
cp: cannot stat '/tmp/和総坂裁精座回資国定裁出観産大掲記労。基利婚岡第員連聞余枚転屋内分。妹販得野取戦名力共重懲好海。要中心和権瓦教雪外間代円題気変知。貴金長情質思毎標豊装欺期権自馬。訓発宮汚祈子報議広組歴職囲世階沙飲。賞携映麻署来掲給見囲優治落取池塚賀残除捜。三売師定短部北自景訴層海全子相表。著漫寺対表前始稿殺法際込五新店広。': File name too long
즉 , cp
실제로 이 파일을 생성하려고 시도했지만 파일 이름이 255바이트를 초과하는 것을 허용하지 않습니다./tmp
/tmp
또한 이 파일을 마우스 패드(GTK 응용 프로그램)에서 열고 편집하고 저장할 수도 있었습니다. 이 모든 것이 작동합니다. 이는 255바이트 제한이 일부 Linux 파일 시스템에만 적용된다는 것을 의미합니다.
그렇다고 해서 모든 일이 순조롭게 진행되는 것은 아닙니다. 예를 들어, 제가 가장 좋아하는 콘솔 파일 관리자인 Midnight Commander는 Norton Commander의 복제품입니다.할 수 없다목록(파일 크기를 0으로 표시), 이 파일 열기 또는 작업 수행:
Error
No such file or directory (2)
답변4
그러나 대부분의 Linux는 최대 파일 이름 길이가 255 UTF-16 문자인 NTFS를 지원한다는 것을 기억합니다.
파일 이름 길이 또는 경로 이름 길이에 대해 이야기하고 있습니까?
NTFS 경로 이름의 최대 길이는 항상 64K 바이트(=32K UTF-16 코드 포인트)입니다.
Win32 API는 (편집자의 의견) 바보 프로그래머들이 선언을 좋아 char filename[MAX_PATH]
하지만 그 주변에 구문상의 혼란이 있기 때문에 더 엄격한 제한을 적용합니다.