Обмеження довжини імені файлу в 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 символів (для тих, хто лінивий натискати на це посилання)
doc_id

11
Ваша відповідь повинна містити принаймні резюме відповідної інформації у наданому посиланні. Не просто посилання.
zrajm

2
@rahmanisback підходить для меж імені файлів, тоді як обмеження шляху зазвичай визначає ОС, а не FS (за винятком деяких дивних FSes, таких як 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 символів - це ім'я шляху пекла. Я впевнений, що це може бути піднято за допомогою перекомпіляції, але, чесно кажучи, / навіщо вам так потрібні імена? /
Avery Payne

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

@AveryPayne Щоб додати теги до файлів, щоб їх можна було шукати за допомогою простого locate.
Хуберт Каріо

3

Немає можливості визначити максимальну довжину шляхів на Linux портативним способом. У моїй системі:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Але я можу легко створювати шляхи набагато довше 4096 символів. Замість цього розгляньте PATH_MAXяк нижню межу. Ви гарантовано зможете створити шляхи так довго, але ви також зможете створити набагато довші.


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

Також, наприклад, os.pathconf()модуль Python матиме відповіді; якщо порт Python корисний, вони повинні бути розумними.
трійка

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

Це правильна відповідь, за винятком того, що це пояснюється коментарем @ BjörnLindqvist. PATH_MAX - це лише керівний принцип, і 99% файлів, ймовірно, будуть в межах цієї межі.
Ралі

1

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

Слід зазначити, однак, що багато з перелічених обмежень не є інваріантними, і під час виконання значення ліміту може відрізнятися від зазначеного в цьому заголовку з наступних причин:

  • Ліміт залежить від імені шляху.

  • Ліміт відрізняється між машинами компіляції та машинами виконання.

З цієї причини програма може використовувати функції fpathconf (), pathconf () та sysconf () для визначення фактичного значення ліміту під час виконання.


0

Він вказаний у файлі заголовка system.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.