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

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

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

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

9 ответов


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

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

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

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

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


в каталоге temp запустите:

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.


на 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

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

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

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

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

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

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

Примечание: как программист, вы не должны жестко закодировать эти ограничения. Вы должны использовать динамическое распределение, чтобы оно всегда работало, пока базовая система позволяет все, что вы делаете.


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

Да, есть.

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

короче:

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

и:

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

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

#define NAME_MAX         255    /* # chars in a file name */

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

посмотреть сравнение файловых систем дополнительные.


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

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


FYI, в Docker ограничение имени файла в настоящее время 242 символов.