Ограничения длины имени файла на Linux?


Ответы:


126

См. Страницу Википедии о сравнении файловых систем , особенно в столбце Максимальная длина имени файла .

Вот некоторые ограничения длины имени файла в популярных файловых системах:

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

45
ответ: ограничение обычно составляет 255 символов (для тех, кому лень
переходить

11
Ваш ответ должен содержать хотя бы краткое изложение соответствующей информации, представленной в указанной ссылке. Не просто ссылка.
Зрайм

2
@rahmanisback подходит для ограничений имени файла, в то время как ограничения пути обычно определяются ОС, а не FS (за исключением некоторых странных FS, таких как iso или ntfs), а в Linux это 4K
nonchip

2
На самом деле это было примерно так: D
nonchip

7
Просто указываю: байты! = Символы, особенно если вы используете UTF-8. Смотрите здесь .
Крис

87

Я читал здесь, что ограничение длины пути в системных заголовках. Ограничение длины имени файла тоже там. В моей системе это файл:

  /usr/src/linux-headers-2.6.38-10/include/linux/limits.h

и C-lang определяет:

  #define NAME_MAX         255    /* # chars in a file name */
  #define PATH_MAX        4096    /* # chars in a path name including nul */

и еще немного.


10
Извините, но я новичок здесь, даже не могу комментировать, кроме голосования. Предыдущий ответ (по sfp) должен быть повышен, так как он полностью отвечает на вопрос, в то время как остальные частично отключены. Опять же, извините за то, что вы пошли помимо правил, но я не могу молчать, когда лучший ответ внизу.
Давид Балажич

1
Просто указываю: байты! = Символы, особенно если вы используете UTF-8. Смотрите здесь .
Крис

1
@ DavidBalažic: Несмотря на то, что PATH_MAX в Linux является верным указанием, большинство базовых файловых систем не имеют ограничений. Это затрудняет ссылки на пути, размер которых превышает этот размер. Я обычно использую "куски" PATH_MAX в качестве размера.
Рахли

23

Я имею в виду другие ответы, пожалуйста, проголосуйте за них.

Есть ли какие-либо ограничения на длину файла или пути в Linux?

Да, длина имени файла и пути ограничена:

Чтобы динамически получить эти свойства:

  • Используйте функции pathconfиfpathconf как предложено Майклом Аароном Сафяном
  • Создайте имя файла (или путь к файлу ) длиннее и длиннее, как объяснено dogbane
  • Используйте команду, getconfпредложенную Тимом, которая также доступна в Linux:

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    


20

И ради экономии времени (и привязки его к памяти):

ext2, ext3, ext4, zfs: без ограничений пути; Ограничение имени файла 255 байт.


1
Однако большинство программ ограничены абсолютными путями PATH_MAX = 4096. Это можно обойти, если ваша программа может использовать относительные пути и вы сначала измените свой рабочий каталог.
Микко Ранталайнен

Это связано с тем, что на различные API POSIX, такие как getcwdи realpath(которые можно переопределить в коде пользовательского пространства, читая метаданные, .а затем изменяя их ..и повторяя до тех пор, пока вы не достигнете корня файловой системы), положитесь PATH_MAX. ( Источник )
ssokolow

6

Это длины имен файловых систем. У самого "linux" тоже есть. Например, из бит / stdio_lim.h:

# define FILENAME_MAX 4096

Таким образом, поскольку файловые системы extX имеют более низкий предел имени файла, чем то, что определено в ядре, вы никогда не достигнете этого предела, если только он также не включает имена путей, верно?
Иван

1
вот как это выглядит для меня. Есть также PATH_MAX для пути, который равен 4096, так что он будет достигнут до "неограниченного" размера пути на exts ... Я не уверен, как ОС разрешает свои собственные внутренние ограничения и ограничения FS, никогда не было мои руки в этом глубоко. интересный вопрос, хотя.
jj33

4096 символов - это чертово имя пути. Я уверен, что это можно было бы сделать с помощью перекомпиляции, но, честно говоря, / зачем вам такие длинные имена путей? /
Эйвери Пейн

Я не уверен, что вам это понадобится или нет. Я рассматриваю это больше как защиту от вредоносных или небрежных программ (я легко мог увидеть скрипт, который ведет себя плохо и начинает рекурсивно создавать тот же каталог. На самом деле, я создал этот скрипт, но он перенаправлял веб-сайт, а не создавал каталоги). ...).
jj33

@AveryPayne Чтобы добавить теги к файлам, чтобы их можно было искать с помощью простого locate.
Хьюберт Карио

3

Там нет никакого способа , чтобы определить максимальную длину путей на Linux переносимым способом. В моей системе:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Но я могу легко создавать пути намного длиннее, чем 4096 символов. Вместо этого смотрите PATH_MAXкак нижнюю границу. Вы гарантированно сможете создавать пути так долго, но вы также можете создавать гораздо более длинные.


Простой переносимый способ определить максимальную длину эмпирически - это написать программу, которая создает все более и более длинные цепочки каталогов, и посмотреть, где она не работает. Вы не будете точно знать, почему это происходит с ошибкой (хотя вы надеетесь получить внушительное для восприятия человеком сообщение об ошибке), но вы будете знать, как далеко вы можете безопасно зайти. Не забудьте проверить как длину отдельного каталога, так и относительную длину пути и абсолютную длину имени пути.
tripleee

Также, например, os.pathconf()модуль Python будет иметь несколько ответов; если порт Python хорош, они должны быть разумными.
tripleee

2
Вы не можете, потому что некоторые файловые системы не накладывают никаких ограничений . Это скорее приведет к ошибке из-за нехватки памяти, из-за которой любой программе будет трудно восстановиться.
Бьорн Линдквист,

Это правильный ответ, за исключением того, что это связано с комментарием @ BjörnLindqvist. PATH_MAX - это просто руководство, и 99% файлов, вероятно, будут в пределах этого предела.
Рахли

1

Вы всегда должны использовать pathconf или какую-либо функцию, подобную этой, чтобы получить значение времени выполнения для указанных элементов, поскольку на этой странице сказано, что:

Однако следует отметить, что многие из перечисленных пределов не являются инвариантными, и во время выполнения значение предела может отличаться от значений, указанных в этом заголовке, по следующим причинам:

  • Предел зависит от имени пути.

  • Предел различается между компиляцией и машинами времени выполнения.

По этим причинам приложение может использовать функции fpathconf (), pathconf () и sysconf () для определения фактического значения лимита во время выполнения.


0

Это указано в системе limits.h файле заголовка.

Вот один из этих файлов:

cat /usr/include/linux/limits.h

...
#define NAME_MAX         255    /* # chars in a file name */
#define PATH_MAX        4096    /* # chars in a path name including nul */
...

Здесь находятся копии этого файла и значения, которые они определяют:

find /usr | grep limits.h | xargs -I {} grep -H 'NAME_MAX' {}

Выход:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.