Яка максимальна довжина файлового шляху в Ubuntu?


9

Довго використовуючи системи Windows, я знаю, що в певний момент може з’явитися вікно помилок, коли назви файлів і папок стають занадто довгими.

Це сталося зі мною, коли я намагався створити резервну копію файлів із SFTP з сервера в папку в (наприклад):

D:(Windows drive partition)/Temporary/Projects/2015-06/Websites/Guitar-Site/Images/Logos/Manufacturers/Instruments/Basses/(long file name).png

Як ви бачите, я, як правило, інколи створює дуже вказані контури папок, і якщо ім'я файлу також буде довгим, NTFS не зможе зберегти його таким чином.

В даний час я переживаю за свої фізичні резервні копії, оскільки шлях до папки на моєму резервному диску буде доданий /backups/(drive name)/...до всіх файлових шляхів.

Чи є в ext4 / Ubuntu такий ліміт (або подібний), на який мені доведеться стежити?


2
Відповідь на ServerFault: 4k. Це обмеження для ОС, а не межа FS. serverfault.com/questions/9546/…
Іван N

Відповіді:


15

Максимальна довжина імені файлу - 255 байт. Знайдено на сторінці вікі для ext4 .

Максимальний шлях - 4096 символів. Знайдено в цьому запитанні для Unix & Linux SE .

Хоча, я знайшов цю статтю у wiki , яка не визначає максимальний шлях до файлу у ext4.


Привіт jtoscarson, дякую за вашу відповідь. Я, напевно, міг би спробувати це переглянути, але ви б не хотіли пояснити, що означає довжина "255 байт"? Я припускаю, що не всі символи обов'язково використовують до 8 біт, так що це було б більше 255 символів, я припускаю? Або, можливо, менше, враховуючи різні набори символів.
Прототип700

Взагалі один символ - це один байт. Я не шукав документацію, але ось простий тест: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m рахує символи, а -c рахує байти. Причиною того, що це 7 замість 6, є кінець символу рядка, який не друкується. Таким чином, загальна кількість символів у імені файлу становитиме 255.
jtoscarson

1
Використання UTF-8 локального повернення 4для echo -n "💩" | wc -c. Створення імені файлу, названого з цим ім'ям, займе 4 байти, незважаючи на те, що це ім'я файлу - 1 графема. "Символ" не є чітко визначеним поняттям (зазвичай це означає байт, графему або кодову точку UNICODE).
Мікко Ранталайнен

У зашифрованих файлових системах максимальна довжина імені файлу - 143 байти. Щоб визначити, чи є ім'я файлу достатньо коротким, ви можете знайти його довжину байтів у Python за допомогою len(filename.encode()).
Марво

0

Я вважаю, що найбільш надійним способом визначити це є pathconf(".", _PC_PATH_MAX);функція POSIX, яка визначає максимальний шлях для даного шляху.

Як підказує функція, це може відрізнятися між файловими системами.

Я не знаю про утиліту командного рядка, яка все-таки розкриває її. Ось мінімальний приклад C: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296


1
Це також може зацікавити: zsh.org/mla/workers/2000/msg03393.html
Сергій Колодяжний,

0

Обмеження імені шляху залежать від використовуваної файлової системи. Відповідь jtoscarson охоплює ext4, який є типовим для Ubuntu, проте ви можете використовувати різноманітні файлові системи на Ubuntu. Щоб навести відповідь WerkkreW на сервері за замовчуванням, ось деякі файлові системи та їх обмеження:

BTRFS   255 bytes
exFAT   255 UTF-16 characters
ext2    255 bytes
ext3    255 bytes
ext3cow 255 bytes
ext4    255 bytes
FAT32   8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS    255 characters
XFS     255 bytes

Зауважте також, що різні файлові системи мають обмеження щодо того, який тип символів може бути присутнім у імені файлу. Наприклад, імена файлів у ext4не можуть містити NULL та /. Дивіться також статтю у Вікіпедії щодо порівнянь файлових систем .

Зауважте також, що файлові системи Linux повинні враховувати визначення POSIX :

3.266 Ім'я-шлях

Рядок символів, який використовується для ідентифікації файлу. У контексті IEEE Std 1003.1-2001, ім'я шляху складається з, щонайменше, {PATH_MAX} байт, включаючи кінцевий нульовий байт. Він має необов'язковий початковий проріз, який супроводжується нулем або більше імен файлів, розділених косою рисою. Ім'я контуру може необов'язково містити одну або більше косої косої риски. Кілька послідовних косої риси вважаються такими ж, як одна коса коса.

З обмежень.h :

{PATH_MAX}

Максимальна кількість байтів у імені шляху, включаючи закінчуючий нульовий символ. Мінімальне прийнятне значення: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Максимальна кількість байтів у імені шляху. Значення: 256


0

Як зазначає @ sergiy-kolodyazhnyy, максимальна довжина імені файлу буде залежати від файлової системи та переважної більшості обмежень імені файлів довжиною до 255 байт.

Помітним упущенням його діаграми є оптичні носії. Хоча розширення UDF та Rock Ridge мають однаковий ліміт 255 символів для імен файлів файлів файлів, ISO9660 без Rock Ridge та Joliet мають набагато більш жорсткі обмеження, проти яких ви можете реально працювати, якщо ви робите щось на кшталт резервного копіювання youtube-dlзавантажень.

Імена файлів Joliet обмежені або 64 кодовими точками UTF-16, або 103 з них, якщо програма для мастерингу дисків має можливість вирватися з специфікації способами, які, здається, не завдають шкоди на практиці.

Так само, ISO 9660 Рівні 2 і 3, без розширень Rock Ridge, обмежуються назви файлів або 31 символом, або 37, якщо ви граєте швидко і вільно зі специфікацією.

ISO 9660: 1999, яка буде підтримана genisoimage але не фронтендів як K3b, має межу або 207 байт (без Rock Ridge) або 197 байт (з Rock Ridge).

(Джерело: Сторінка genisoimage)

Що стосується максимальної довжини шляху , то це велика помилка. Для більшості файлових систем Linux не існує жодної.

Там є константа з ім'ям PATH_MAX, але це тільки максимум для певних інтерфейсів POSIX , які ви можете працювати навколо .

Єдиними наслідковими винятками з цієї норми "без обмеження довжини шляху" є FAT32 і exFAT (32 760 символів Unicode), NTFS і ReFS (32 767 символів Unicode), UDF (1023 байти) та ISO 9660 (незрозуміло, але я бачив він вказав як 180, 207, 212 або 222 байт).

Це можна легко продемонструвати, запустивши цю невелику програму Python, а потім вивчивши отримані каталоги.

import os
for X in range(20):
    os.mkdir('x' * 255)
    os.chdir('x' * 255)

Мій bash, який відображає весь шлях у запиті, матиме проблеми з цим. Однак мій zsh, який відображає лише поточну папку в підказці, не матиме проблем і навіть має pwdвбудований модуль, який може без проблем відображати весь шлях 5000 + байт.

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