Ограничить длину имени файла в bash

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

В каталоге 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.

Ответ 3

В 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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

  • Существует ли ограничение на количество символов в абсолютном пути имени файла?

Да, есть.

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

Короче:

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

И для:

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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