Ограничение на длину имени файла в bash - PullRequest
68 голосов
/ 04 июля 2011

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

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

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

Ответы [ 9 ]

60 голосов
/ 04 июля 2011

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

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

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

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

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

36 голосов
/ 04 июля 2011

Во временном каталоге выполните:

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.

14 голосов
/ 05 июля 2011

В 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
10 голосов
/ 24 мая 2014

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

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

Для динамического получения этих свойств в :

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

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    
8 голосов
/ 04 июля 2011

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

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

3 голосов
/ 19 мая 2013
  1. Существует ли ограничение на количество символов в абсолютном пути к файлу?

Да, есть.

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

Короче говоря:

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

А для:

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

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

#define NAME_MAX         255    /* # chars in a file name */
2 голосов
/ 04 июля 2011

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

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

2 голосов
/ 04 июля 2011

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

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

1 голос
/ 16 марта 2017

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

...