Linux длинные имена файлов

Filename length limits on linux?

See the Wikipedia page about file systems comparison, especially in column Maximum filename length.

Here are some filename length limits in popular file systems:

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 

@rahmanisback that’s right for filename limits, while path limits are usually defined by the OS, not FS (except for some strange FSes like iso or ntfs), and, on linux, are 4K

I’m shocked by these limits. Files per directory is unlimited, 4 billion files per volume, file sizes into the terabytes, volume sizes go to exabytes but we have a stupid limit of 255 bytes for file names?

It should also be mentioned that if you layer eCryptFS with filename encryption on top of these file systems (as installed in Ubuntu with encrypted home dir option) the effective maximum filename length will only be 143 characters. See: unix.stackexchange.com/a/32834/47938

I’ve read here that path length limit is in system headers. File name length limit is there too. On my system it’s file:

 /usr/src/linux-headers-2.6.38-10/include/linux/limits.h 
 #define NAME_MAX 255 /* # chars in a file name */ #define PATH_MAX 4096 /* # chars in a path name including nul */ 

Sorry, but I’am new here an can’t even comment, save vote. The previous answer (by sfp) should be upped, as it answers the question completely, while the others are partially off. Again, sorry for going besides the rules, but I can’t be quiet when the best answer is at the bottom.

@DavidBalažic: Although true, PATH_MAX under linux is just a guideline, most of the underlying file systems do not have a limitation. This makes it hard to reference paths that greater than that size. I usually use «chunks» of PATH_MAX as a size.

I refer to other answers, please upvote them.

Are there any filename or path length limits on Linux?

Yes, filename and pathname lengths are limited by :

To dynamically get these properties:

  • Use functions pathconf and fpathconf as proposed by Michael Aaron Safyan
  • Create a filename (or pathname) longer and longer as explained by dogbane
  • Use the command getconf as proposed by tim that is also available on Linux:
$ getconf NAME_MAX /mnt/sda2/ 255 $ getconf PATH_MAX /mnt/sda3/ 4096 

And for the sake of saving time (and anchoring it to memory):

ext2, ext3, ext4, zfs: no pathname limits; 255 bytes filename limit.

Most programs are limited with absolute paths to PATH_MAX = 4096 , though. That can be worked around if your program is able to use relative paths and you change your working directory first.

It’s because various POSIX APIs such as getcwd and realpath (which you can reimplement in userspace code by reading the metadata for . and then changing to .. and repeating until you hit the filesystem root) rely on PATH_MAX . (Source)

Yes, however, awfully lot of misc library code is prone to break if your code changes current directory at will. A well made code doesn’t break but most of the existing code is not well made.

Those are file system name lengths. «linux» itself has some too. For instance, from bits/stdio_lim.h:

So since the extX filesystems have a lower filename limit than what’s defined in the kernel, you wouldn’t ever hit that limit, unless it also encompases pathnames, right?

that’s what it looks like to me. There’s also PATH_MAX for the path, which is 4096, so it would be hit before the «unlimited» path size on the exts. I’m not sure how the OS resolves its own internal restrictions and those of the FS, never had my arms in that deep. interesting question though.

4096 characters is a helluva path name. I’m sure it could be raised with a recompile, but honestly, /why would you need pathnames that long?/

I’m not sure you would need it or not. I view it more as a protection against malicious or negligent programs (I could easily see a script that behaves poorly and begins creating the same dir recursively. Actually, I’ve made that script, but it was redirecting a web site, not creating dirs. ).

There is no way to determine the maximum length of paths on Linux in a portable way. On my system:

$ getconf PATH_MAX / 4096 $ getconf _POSIX_PATH_MAX / 4096 

But I can easily create paths much longer than 4096 characters. Instead see PATH_MAX as a lower bound. You are guaranteed to be able to create paths this long, but you might also be able to create much longer ones.

A simple portable way to find the maximum length empirically is to write a program which creates longer and longer directory chains, and see where it fails. You won’t know exactly why it fails (though you would hope for a suggestive human-readable error message) but you’ll know how far you can safely go. Remember to check for both individual directory length, relative pathname length, and absolute pathname length.

Also, e.g. the Python os.pathconf() module will have some answers; if the Python port is any good, they should be reasonable.

You can’t because some filesystems don’t impose any limits. It would sooner fail with an out of memory error which any program would have a hard time recovering from.

This is the correct answer, except this is due to @BjörnLindqvist comment. PATH_MAX is just a guideline, and 99% of files will probably be within that limit.

Источник

Длинные имена файлов

Всем привет переношу файлопомойку с винды на линукс. Столкнулся с проблемой «очень длинных имён файлов». Похоже, счёт идет не на символы, а на байты (гугление это подтверждает). Внимание, вопрос: мне таки придётся использовать винду или есть какое-то решение этой проблемы? (усекновение имени — не решение в данной ситуации)

ext2/3/4,reiser,xfs,jfs — все поддерживают 255 символов в имени файла (или 127 в UTF8) — куда вам больше??

Поправочка: 127 русских букв, закодированных в UTF8.

UTF8 — однобайтовая кодировка, так что ASCII в UTF8 = ASCII 🙂

ФС те, которые поддерживаются CentOS 5.4 — то есть ext2/3, ext4 без mkfs.ext4, xfs на положении ext4.

127 букв — внезапно оказалось мало. Есть у пользователей такие имена файлов:

«Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)»

Усекновение — не вариант. На винде такое имя файла обрабатвается корректно

$ echo «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)» | wc -c

$ touch «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)»

$ ls Котов*
Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)

Если очень нужно, то можно поставить однобайтную локаль. Хотя да, не решение.

megabaks@localhost ~ $ touch "Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)" touch: невозможно выполнить touch для «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)»: Слишком длинное имя файла

localhost / # touch "Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)" touch: невозможно выполнить touch для «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)»: Слишком длинное имя файла 

localhost boot # touch "Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)" touch: невозможно выполнить touch для «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)»: Слишком длинное имя файла

+1 ext3, debian lenny, создался

> у кого-то из нас перацкий линукс ^_^ ext3

А, это у меня, как x3al заметил, кодировка однобайтная.

$ echo «Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)» | wc -c
167

ааа — ну тогда понятно, молчу
не перацкий )

.-(~)---------------------------------------------------------(gotf@persephone)- `--> touch "Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)" touch: cannot touch `Котов АН Моделирование дорожного движения на многополосной магистрали при помощи двумерного вероятностного клеточного автомата с тремя состояниями, 2008 (диссертация)': File name too long

Хотя, если верить педивикии, ограничений в XFS (равно, как и ext*) нету.

Т.е. ограничений нет в самой ФС, но они могут устанавливаться драйвером.

А ведь проблема, если на имя файла что-то завязано. значит, если переделать никак, то Win. Вообще, как-то криво реализация UTF сделана, получается. Не зря оно мне доверия не внушает всё ещё.

Источник

Какой максимальной длины может быть имя файла в Linux?

Есть ли ограничение на длину имен файлов и директорий в Linux? Можно ли создать файл с именем, в котором будет 1000 символов?

Да, такое ограничение существует.

Если попробовать создать файл с очень длинным именем, то возникнет ошибка:

touch IktomiisaspiderfairyHewearsbrowndeerskinlegginswithlongsoftfringesoneithersideandtinybeadedmoccasinsonhisfeetHislongblackhairispartedinthemiddleandwrappedwithredredbandsEachroundbraidhangsoverasmallbrownearandfallsforwardoverhisshouldersHeevenpaintshisfunnyfacewithredandyellowanddrawsbigblackringsaroundhiseyesHewearsadeerskinjacketwithbrightcoloredbeadssewedtightlyonitIktomidresseslikearealDakotabraveIntruthhispaintanddeerskinsarethebestpartofhimifeverdressispartofmanorfairy touch: невозможно выполнить touch для 'IktomiisaspiderfairyHewearsbrowndeerskinlegginswithlongsoftfringesoneithersideandtinybeadedmoccasinsonhisfeetHislongblackhairispartedinthemiddleandwrappedwithredredbandsEachroundbraidhangsoverasmallbrownearandfallsforwardoverhisshouldersHeevenpaintshisfunnyfacewithredandyellowanddrawsbigblackringsaroundhiseyesHewearsadeerskinjacketwithbrightcoloredbeadssewedtightlyonitIktomidresseslikearealDakotabraveIntruthhispaintanddeerskinsarethebestpartofhimifeverdressispartofmanorfairy': Слишком длинное имя файла

В Linux максимальная длина имени файла или директории составляет 255 байт.

Но нужно знать, что каждый символ английского алфавита занимает 1 байт. То есть длина в 255 байт эквивалентна 255 символам английского алфавита.

А каждая кириллическая буква занимает 2 байта. Получается, что если создавать файл только из букв русского алфавита, то максимальная длина составит всего 256/2=127,5 или просто 127 символов.

Например, можно создать вот такой файл:

touch ЖилибылипузырьсоломинкаилапотьПошлионивлесдроварубитьДошлидорекиинезнаюткакчерезрекуперейтиЛапотьговоритпузырюПузырьдавайнатебе

Источник

Читайте также:  Where is postgresql in linux
Оцените статью
Adblock
detector