ограничения длины имени файла на linux?

<p>есть ли какие-либо ограничения на длину файла или пути в linux?</p>

<p>смотрите <a href="http://en.wikipedia.org/wiki/comparison\_of\_file\_systems#limits">страница википедии о сравнении файловых систем</a> , особенно в столбце <strong> максимальная длина имени файла </strong>.</p><p>вот некоторые <em> ограничения длины имени файла</em> в популярных файловых системах:</p><pre><code>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 </code></pre>

<p>я прочитал <a href="https://web.archive.org/web/20160612154907/http://fixunix.com/questions/14623-max-length-absolute-path-linux.html">здесь</a> , что ограничение длины пути в системных заголовках. ограничение длины имени файла тоже там. в моей системе это файл:</p><pre><code> /usr/src/linux-headers-2.6.38-10/include/linux/limits.h </code></pre><p>и c-lang определяет:</p><pre><code> #define name\_max 255 /* # chars in a file name */ #define path\_max 4096 /* # chars in a path name including nul */ </code></pre><p>и еще немного.</p>

<p><sup>я имею в виду другие ответы, пожалуйста, проголосуйте за них.</sup></p><blockquote> <p>есть ли какие-либо ограничения на длину файла или пути в linux?</p> </blockquote><p>да, длина имени файла и пути ограничена:</p><ul> <li> <a href="http://en.wikipedia.org/wiki/comparison\_of\_file\_systems#limits">ограничения файловой системы</a> как указано <a href="https://serverfault.com/a/9548/106052">werkkrew</a> ;</li> <li>константы, определенные в <code>linux/limits.h</code> как указано <a href="https://serverfault.com/a/306726/106052">sfp</a> .</li> </ul><p>чтобы динамически получить эти свойства:</p><ul> <li>используйте функции <a href="http://www.gnu.org/software/libc/manual/html\_node/pathconf.html"><code>pathconf</code> и <code>fpathconf</code></a> в соответствии с предложением <a href="https://stackoverflow.com/a/6571596/938111">майкл аарон сафян</a> </li> <li>создайте имя файла (или путь к файлу) длиннее и длиннее, как описано в <a href="https://stackoverflow.com/a/6571693/938111">dogbane</a> </li> <li> <p>используйте команду <code>getconf</code>, предложенную <a href="https://stackoverflow.com/a/6582758/938111">tim</a> , которая также доступна в linux:</p> <pre><code>$ getconf name_max /mnt/sda2/ 255 $ getconf path\_max /mnt/sda3/ 4096 </code></pre></li> </ul>

<p>и ради экономии времени (и привязки его к памяти):</p><p>ext2, ext3, ext4, zfs: без ограничений пути; ограничение имени файла 255 байт.</p>

<p>это длины имен файловых систем. у самого "linux" тоже есть. например, из бита/stdio\_lim.h:</p><pre><code># define filename\_max 4096 </code></pre>

<p>существует <strong>никак</strong> для определения максимальной длины путей в linux переносимым способом. в моей системе:</p><pre><code>$ getconf path_max / 4096 $ getconf \_posix\_path\_max / 4096 </code></pre><p>но я могу легко создавать пути намного длиннее, чем 4096 символов. вместо этого смотрите <code>path\_max</code> как нижняя граница. вы гарантированно сможете создавать пути так долго, но вы также можете создавать гораздо более длинные.</p>

<p>вы всегда должны использовать <strong> pathconf </strong> или какую-либо подобную функцию, чтобы получить значение времени выполнения для указанных элементов, так как это <a href="http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html">page</a> говорит, что :</p><blockquote> <p>однако следует отметить, что многие из перечисленных пределов не являются инвариантными, и во время выполнения значение предела может отличаться от значений, указанных в этом заголовке, по следующим причинам:</p> <ul> <li> <p>предел зависит от имени пути.</p> </li> <li> <p><strong> предел различается между компиляцией и машинами времени выполнения. </strong></p> </li> </ul> <p>по этим причинам приложение может использовать функции fpathconf (), pathconf () и sysconf () для определения фактического значения предела во время выполнения.</p> </blockquote>

<p>он указан в заголовочном файле системы <em>limit.h</em>.</p><p>вот один из этих файлов:</p><pre><code>cat /usr/include/linux/limits.h ... #define name\_max 255 /* # chars in a file name */ #define path\_max 4096 /* # chars in a path name including nul */ ... </code></pre><p>здесь находятся копии этого файла и значения, которые они определяют:</p><pre><code>find /usr | grep limits.h | xargs -i {} grep -h 'name\_max' {} </code></pre><p>вывод:</p><pre><code>... /usr/include/linux/limits.h:#define name\_max 255 /* # chars in a file name */ ... </code></pre>