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

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

8 ответов

Решение

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

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

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

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

  /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 */

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

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

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

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

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

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

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

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

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

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

# define FILENAME_MAX 4096

Невозможно определить максимальную длину путей в Linux переносимым способом. В моей системе:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

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

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

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

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

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

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

Это указывается в системном заголовочном файле.

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

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 */
...
Другие вопросы по тегам