Ограничение длины имени файла в bash

Следующие вопросы предназначены только для bash и linux:

  1. Есть ли ограничение на количество символов в абсолютном пути к файлу?
  2. Есть ли ограничение на количество символов только для имени файла (без расширения)?

Если да, то каковы могут быть эти ограничения? Как я могу получить к ним доступ, если они зависят от системы?


person Sriram    schedule 04.07.2011    source источник
comment
Мне всегда было интересно, как люди могут достигать ограничений, таких как длина имени файла. что вы делаете?   -  person Karoly Horvath    schedule 04.07.2011
comment
@yi_H: LOL! ничего, просто записывая большое имя файла (абсолютный путь) в файл и считывая имя из него. Чтение происходит внутри звездочки, и я должен выяснить, сколько символов мне нужно прочитать. Этот вопрос возник как бы в стороне оттуда.   -  person Sriram    schedule 04.07.2011
comment
Это так пахнет домашним заданием ... но, в конце концов, оно принадлежит ServerFault, SuperUser или Unix и Linux.   -  person Bobby    schedule 04.07.2011
comment
@ Бобби: Если бы это было домашнее задание, я бы так и назвал.   -  person Sriram    schedule 04.07.2011
comment
@Sriram: Да, я так и думал. Это был просто вывод, никакого оскорбления не было.   -  person Bobby    schedule 04.07.2011
comment
@Bobby: не волнуйтесь, я не воспринял ваш комментарий как оскорбление или что-то в этом роде ... ура!   -  person Sriram    schedule 04.07.2011
comment
@KarolyHorvath Я только пытался в своем коде закодировать информацию о том, как данные были сгенерированы в имя файла, но не смог написать im_syn_profile_BT,Radar94Z,_to_IWC,_chans1,2,3,4,5,6,7,8,9,10,11,12,_noise1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1.000000e-01,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,_0.mat :(   -  person gerrit    schedule 20.03.2013


Ответы (9)


Это очень сильно зависит от файловой системы. Для ext FS (в настоящее время наиболее часто используемого в Linux):

  • максимальная длина имени файла: 255 байт
  • максимальная длина пути: нет

Расширение - это не то, о чем знает ФС, это 255 байтов, включая расширение (вы можете иметь имена файлов без каких-либо расширений).

Вот более исчерпывающий список этих ограничений для каждой FS.

В вашей файловой системе также могут быть расширения, которые также могут изменять вашу максимальную длину. Например, eCryptFS, которая использует часть нижнего имени файла для хранения метаданных и ограничивает имя файла максимальной длиной 143 символа. См. Запись Ubuntu eCryptFS launchpad.

person e-satis    schedule 04.07.2011
comment
Существует также наложенный лимит ядра Linux PATH_MAX, определенный в linux / limits .h, что обычно составляет 4096 символов. Последний символ зарезервирован для нулевого символа конца строки. - person BeowulfNode42; 20.02.2014
comment
Также каждое приложение может иметь свой собственный лимит. - person BeowulfNode42; 20.02.2014
comment
Если у кого-то есть сомнения: объединив этот ответ с этим на ecryptfs, я смог убедиться, что ошибка все еще не решена (хотя чтение самой ошибки заставляет меня думать, что она никогда не будет решена) - person ThanksForAllTheFish; 09.03.2015

Во временном каталоге запустите:

num=1
while [ true ]
do 
   if ! touch $(printf "%${num}s"  | tr ' ' 'a')
   then
       echo $num
       break
   fi
   ((num++))
done

и я получаю:

touch: cannot touch `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': File name too long
256

Это означает, что мой лимит равен 255.

person dogbane    schedule 04.07.2011
comment
Я получаю 144, что означает, что у меня лимит 143. Почему так мало !? Я использую 64-разрядную версию Ubuntu 16.04 LTS. - person Gabriel Staples; 13.06.2019

В Mac OS X 10.6.7:

man getconf
getconf NAME_MAX /   # 255 bytes
getconf PATH_MAX /   # 1024 bytes

# check file path length with wc before using touch, mkdir, etc.
echo '/very/lllooooonnnnnggggg/file/path.txt' | wc -c
person tim    schedule 05.07.2011

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

В Linux длина имени файла и пути зависит от:

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

  • Создайте имя файла (или путь) все длиннее и длиннее, как описано в dogbane
  • Используйте команду getconf, предложенную tim, которая также доступна в Linux:

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    
person oHo    schedule 24.05.2014

В единой спецификации UNIX упоминаются константы NAME_MAX и PATH_MAX в limits.h, которые можно прочитать с помощью pathconf. Однако это очень зависит от файловой системы, и вы вряд ли достигнете такого предела.

ПРИМЕЧАНИЕ. Как программист, вам не следует жестко кодировать эти ограничения. Вы должны использовать динамическое размещение, чтобы оно всегда работало, пока базовая система позволяет вам делать то, что вы делаете.

person Michael Aaron Safyan    schedule 04.07.2011

  1. Есть ли ограничение на количество символов в абсолютном пути к файлу?

Да, есть.

См. ответ sfp на вопрос Ограничения длины имени файла в Linux? на сервере ошибка

Суммируя:

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

И для:

  1. Есть ли ограничение на количество символов только для имени файла (без расширения)?

в том же связанном ответе:

#define NAME_MAX         255    /* # chars in a file name */
person David Balažic    schedule 19.05.2013
comment
Спасибо за ссылку на аналогичный вопрос по serverfault. Но я не думаю, что ответ от sft хорош. Я предпочитаю ответ от @WerkkreW с хорошей ссылкой: en.wikipedia.org/wiki/Comparison_of_file_systems# Лимиты - person oHo; 20.05.2013
comment
Эта ссылка касается файловых систем, а не bash или linux, как указано в вопросе. Например, в нем не указано ограничение для файловой системы ext3, но в Linux есть ограничение в 4096 (независимо от файловой системы). - person David Balažic; 20.05.2014
comment
Я согласен с вами :-) Спасибо, что указали на аналогичный вопрос +1 :-) Допустим, это зависит от обоих: FS и linux/limits.h. Но окончательным ответом будет что-то вроде cat /proc/sys/fs/file-max или ... getconf NAME_MAX / ... Да, последняя команда хорошая ... и tim как нашел до меня. Ваше здоровье - person oHo; 24.05.2014

К вашему сведению, в Docker ограничение на имя файла в настоящее время составляет 242 символа.

person jp.rider63    schedule 16.03.2017

Это зависит от используемой файловой системы. Например, ext4 имеет максимальную длину имени файла 256 байт и неограниченную длину пути.

Подробнее см. Сравнение файловых систем.

person Eugene Yarmash    schedule 04.07.2011
comment
Черт, ты меня поймал. - person e-satis; 04.07.2011

Это не зависит от bash; это зависит от ОС. На Mac это 0xff для имени файла и 0x400 или около того для имени пути. Ubuntu 9 имеет ограничение в 144 символа для имен файлов.

Я нашел эту ссылку в Википедии. Он сообщает ограничения пути и имени файла для множества файловых систем.

person ncmathsadist    schedule 04.07.2011
comment
У задействованного Mac есть HFS +, а у Unix-машины - ext4. - person ncmathsadist; 04.07.2011