Какова максимальная длина пути к файлу в Ubuntu?

9

Давно пользуясь системами Windows, я знаю, что в определенный момент может появиться окно с ошибкой, когда имена файлов и папок становятся слишком длинными.

Это случилось со мной, когда я попытался сделать резервную копию файлов с SFTP с сервера в папку (например):

D:(Windows drive partition)/Temporary/Projects/2015-06/Websites/Guitar-Site/Images/Logos/Manufacturers/Instruments/Basses/(long file name).png

Как вы можете видеть, я иногда создаю очень определенные пути к папкам, и если имя файла слишком длинное, NTFS может не сохранить его таким образом.

В настоящее время я беспокоюсь о своих физических резервных копиях, так как путь к папке на моем резервном диске добавит /backups/(drive name)/...ко всем путям файлов.

Есть ли такой предел (или аналогичный) в ext4 / Ubuntu, на который мне пришлось бы обратить внимание?

Prototype700
источник
2
Ответил на ServerFault: 4k. Это предел ОС, а не предел ФС. serverfault.com/questions/9546/…
Джон Н

Ответы:

15

Максимальная длина имени файла составляет 255 байт. Найдено на странице вики для ext4 .

И максимальный путь 4096 символов. Нашел в этом вопросе Unix & Linux SE .

Хотя я нашел эту вики-статью , в которой не указан максимальный путь к файлу в ext4.

jtoscarson
источник
Привет jtoscarson, спасибо за ваш ответ. Я мог бы попытаться найти это, но не могли бы вы объяснить, что означает длина «255 байт»? Я предполагаю, что не все символы обязательно занимают 8 битов, так что это будет в общей сложности более 255 символов, я полагаю? Или, может быть, меньше, учитывая, что могут использоваться разные наборы символов.
Prototype700
Вообще говоря, один символ - это один байт. Я не искал документацию, но вот простой тест: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m подсчитывает символы, а -c подсчитывает байты. Причиной, почему это 7 вместо 6, является символ конца строки, который не печатается. Таким образом, общее количество символов в имени файла будет 255.
jtoscarson
1
Использование языка UTF-8 возвращает 4для echo -n "💩" | wc -c. Создание имени файла с таким именем заняло бы 4 байта, несмотря на то, что это имя имеет длину в 1 графему. «Символ» не является четко определенным понятием (обычно это байт, графема или кодовая точка UNICODE).
Микко Ранталайнен,
В зашифрованных файловых системах максимальная длина имени файла составляет 143 байта. Чтобы решить, достаточно ли короткое имя файла, вы можете найти его длину в байтах в Python с помощью len(filename.encode()).
Марво
0

Я считаю, что наиболее надежный способ определить это с помощью pathconf(".", _PC_PATH_MAX);функции POSIX, которая определяет максимальный путь для данного пути.

Как предполагает функция, это может варьироваться между файловыми системами.

Я не знаю утилиты командной строки, которая выставляет это все же. Вот минимальный пример C: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
источник
1
Это также может представлять интерес: zsh.org/mla/workers/2000/msg03393.html
Сергей Колодяжный,
0

Ограничения пути зависят от используемой файловой системы. Ответ jtoscarson охватывает ext4, который используется по умолчанию в Ubuntu, однако вы можете использовать различные файловые системы в Ubuntu. Чтобы процитировать ответ WerkkreW о сбое сервера, вот некоторые из файловых систем и их ограничения:

BTRFS   255 bytes
exFAT   255 UTF-16 characters
ext2    255 bytes
ext3    255 bytes
ext3cow 255 bytes
ext4    255 bytes
FAT32   8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS    255 characters
XFS     255 bytes

Также обратите внимание, что различные файловые системы имеют ограничения относительно того, какой тип символа может присутствовать в имени файла. Например, имена файлов в ext4не могут содержать NULL и /. Смотрите также статью в Википедии для сравнения файловых систем .

Также обратите внимание, что файловые системы Linux должны учитывать определения POSIX :

3.266 Путь

Символьная строка, используемая для идентификации файла. В контексте стандарта IEEE Std 1003.1-2001 имя пути состоит не более чем из {PATH_MAX} байтов, включая завершающий нулевой байт. Он имеет необязательный начальный слеш, за которым следуют ноль или более имен файлов, разделенных косыми чертами. Имя пути может содержать один или несколько завершающих слэшей. Несколько последовательных слешей считаются такими же, как один слеш.

Из пределов. Ч :

{} PATH_MAX

Максимальное количество байтов в пути, включая завершающий нулевой символ. Минимально допустимое значение: {_POSIX_PATH_MAX}

{} _POSIX_PATH_MAX

Максимальное количество байтов в пути. Значение: 256

Сергей Колодяжный
источник
0

Как сказал @ sergiy-kolodyazhnyy, максимальная длина имени файла будет зависеть от файловой системы, а подавляющее большинство ограничивает длину имени файла 255 байтами.

Заметное упущение из его таблицы - оптические носители. В то время как расширения UDF и Rock Ridge имеют одинаковое ограничение в 255 символов для имен файлов, ISO9660 без Rock Ridge и Joliet имеют гораздо более строгие ограничения, с которыми вы можете столкнуться, если делаете что-то вроде резервного копирования youtube-dlзагрузок.

Имена файлов Joliet ограничены либо 64 кодовыми точками UTF-16, либо 103 из них, если ваша программа для мастеринга дисков имеет возможность отойти от спецификации способами, которые, как кажется, не причиняют вреда на практике.

Аналогично, уровни 2 и 3 стандарта ISO 9660, без расширений Rock Ridge, ограничены именами файлов из 31 символа или 37, если вы играете быстро и плохо со спецификацией.

ISO 9660: 1999, которая будет поддержана genisoimage но не фронтэнды как K3b, имеет предел либо 207 байт (без Rock Ridge) или 197 байт (с Rock Ridge).

(Источник: genisoimageсправочная страница)

Что касается максимальной длины пути , это большое заблуждение. Нет такой для большинства файловых систем Linux.

Там есть константа с именем PATH_MAX, но это только максимум для определенных интерфейсов POSIX , которые вы можете работать вокруг .

Единственными вытекающими исключениями из этого соглашения «без ограничения длины пути» являются FAT32 и exFAT (32 760 символов Unicode), NTFS и ReFS (32 767 символов Unicode), UDF (1 023 байта) и ISO 9660 (неясно, но я видел оно указывается как 180, 207, 212 или 222 байта).

Это можно легко продемонстрировать, запустив эту маленькую программу на Python, а затем изучив получившиеся каталоги.

import os
for X in range(20):
    os.mkdir('x' * 255)
    os.chdir('x' * 255)

Мой bash, который отображает весь путь в приглашении, будет иметь проблемы с ним. Однако my zsh, которая отображает только текущую папку в приглашении, не будет иметь проблем и даже имеет pwdвстроенную функцию, которая может отображать весь путь длиной более 5000 байт без проблем.

ssokolow
источник