Обмеження довжини імені файлу в bash


76

Наступні запитання призначені лише для bash та linux:

  1. Чи існує обмеження на кількість символів в імені абсолютного шляху до файлу?
  2. Чи обмежена кількість символів лише для імені файлу (без розширення)?

Якщо так, то якими можуть бути ці межі? Як я можу отримати до них доступ, якщо вони специфічні для системи?


6
Я завжди дивувався, як люди можуть досягти обмежень, таких як довжина імені файлу. що ви робите?
Каролі Горват,

@yi_H: LOL! нічого, просто напишіть у файл велике ім'я файлу (абсолютний шлях) і прочитайте з нього ім'я. Читання відбувається з зірочкою, і я повинен зрозуміти, скільки символів мені потрібно прочитати. Це питання виникло як осторонь.
Шрірам,

1
Це так пахне домашнім завданням ... але врешті-решт воно належить до ServerFault, SuperUser або Unix & Linux.
Боббі,

1
@Bobby: Якби це було домашнє завдання, я б це так позначив.
Шрірам,

1
@Bobby: не хвилюйся, я не сприйняв твій коментар як образу чи щось подібне .. ура!
Шрірам,

Відповіді:


71

Це дуже залежить від файлової системи. Для ext FS (в даний час найбільш часто використовується в Linux):

  • максимальна довжина імені файлу: 255 байт
  • макс. довжина шляху: немає

Розширення не те, про що знає FS, воно має 255 байт, розширення включено (ви можете мати імена файлів без будь-яких розширень).

Ось більш вичерпний перелік цих обмежень для ФС.

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


7
Існує також обмеження ядра Linux PATH_MAX, визначене в linux / limit.h, яке зазвичай становить 4096 символів. Останній символ зарезервований для нульового символу термінатора рядка.
BeowulfNode42

Крім того, кожна заявка може мати свій власний ліміт, який вона встановлює.
BeowulfNode42

На випадок, якщо хтось сумнівається: поєднавши цю відповідь з цією на a ecryptfs, я зміг переконатися, що помилка все ще невирішена (хоча читання самої помилки змушує мене думати, що вона ніколи не буде вирішена)
ThanksForAllTheFish

38

У тимчасовій директорії запустіть:

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.


1
Я отримую 144, що означає, що мій ліміт - 143. Чому так коротко !? Я використовую Ubuntu 16.04 LTS 64-bit.
Габріель Стейплз

15

У 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

Я посилаюся на інші відповіді, будь ласка, проголосуйте їх.

У Linux довжина імені файлу та шляху залежить від:

Динамічно отримувати ці властивості в :

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

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

8

Єдина специфікація UNIX згадує NAME_MAXта PATH_MAXконстанти в limit.h, які можна прочитати за допомогою pathconf . Однак це дуже залежить від файлової системи, і ви навряд чи досягнете такої межі.

ПРИМІТКА: Як програмісту, ви не повинні жорстко кодувати ці обмеження. Ви повинні використовувати динамічне розподіл, щоб воно завжди працювало до тих пір, поки основна система дозволяє все, що ви робите.


4
  1. Чи існує обмеження на кількість символів в імені абсолютного шляху до файлу?

Так, є.

Дивіться відповідь sfp на запитання Обмеження довжини імені файлу в Linux? на помилку сервера

Коротко:

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

А для:

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

у тій же пов'язаній відповіді:

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

1
Дякуємо за посилання на подібне запитання на сервері за замовчуванням. Але я не думаю, що відповідь від sft є досить хорошою. Я вважаю за краще, щоб відповідь від @WerkkreW дав хороше посилання: en.wikipedia.org/wiki/Comparison_of_file_systems#Limits
oHo

1
Це посилання стосується файлових систем, а не bash або linux, як зазначено у питанні. Наприклад, у ньому не вказано обмежень, визначених для файлової системи ext3, але Linux має обмеження 4096 (незалежно від файлової системи).
Девід Балажич,

1
Я згоден з вами :-) Дякую, що вказали на подібне запитання +1 :-) Скажімо, це залежить від обох: FS та linux/limits.h. Але кінцевою відповіддю буде щось на зразокcat /proc/sys/fs/file-max або ... getconf NAME_MAX /... Так, остання команда є хорошою ... і Тім, як це знайшов переді мною. Привітання
Ого



2

Це не залежить від удару; це залежить від ОС. У mac його 0xff для імені файлу і 0x400 або близько того для імені шляху. Ubuntu 9 обмежував 144 символи для імен файлів.

Я знайшов це посилання у Вікіпедії . Він розповідає про обмеження шляху та імені файлу для численних файлових систем.


Задіяний mac має HFS +, а машина Unix ext4.
ncmathsadist
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.