¿Cuál es la longitud máxima de una ruta de archivo en Ubuntu?

9

Después de haber utilizado los sistemas Windows durante mucho tiempo, sé que en cierto punto, puede aparecer una ventana de error cuando los archivos y los nombres de las carpetas se vuelven demasiado largos.

Esto me sucedió cuando intenté hacer una copia de seguridad de archivos con SFTP desde un servidor a una carpeta en (por ejemplo):

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

Como puede ver, a veces tiendo a crear rutas de carpetas muy específicas y si el nombre de un archivo también es largo, NTFS podría no ser capaz de guardarlo de esta manera.

Actualmente estoy preocupado por mis copias de seguridad físicas, ya que la ruta de la carpeta en mi unidad de copia de seguridad se agregará /backups/(drive name)/...a todas las rutas de archivos.

¿Hay algún límite (o similar) en ext4 / Ubuntu que deba tener en cuenta?

Prototipo700
fuente
2
Respondido en ServerFault: 4k. Es un límite del sistema operativo, no un límite de FS. serverfault.com/questions/9546/…
John N

Respuestas:

15

La longitud máxima del nombre de archivo es 255 bytes. Encontrado en la página wiki para ext4 .

Y una ruta máxima de 4096 caracteres. Encontrado en esta pregunta de Unix y Linux SE .

Sin embargo, encontré este artículo wiki que no especifica una ruta de archivo máxima en ext4.

jtoscarson
fuente
Hola jtoscarson, gracias por tu respuesta. Probablemente podría intentar buscar esto, pero ¿le gustaría explicar qué significa una longitud de "255 bytes"? Supongo que no todos los caracteres usan necesariamente 8 bits, por lo que supondría más de 255 caracteres en total. O tal vez menos, teniendo en cuenta que podrían usarse diferentes conjuntos de caracteres.
Prototype700
En general, un solo carácter es un byte. No busqué la documentación, pero aquí hay una prueba simple: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m está contando caracteres y -c está contando bytes. La razón por la cual es 7 en lugar de 6 es el carácter de final de línea que no se imprime. Entonces, el total de caracteres en el nombre del archivo será 255.
jtoscarson
1
El uso de la configuración regional UTF-8 devuelve 4para echo -n "💩" | wc -c. Crear un nombre de archivo llamado con ese nombre tomaría 4 bytes a pesar del hecho de que este nombre de archivo tiene 1 grafema de largo. Un "carácter" no es un concepto claramente definido (generalmente significa byte, grafema o punto de código UNICODE).
Mikko Rantalainen
En los sistemas de archivos cifrados, la longitud máxima del nombre de archivo es de 143 bytes. Para decidir si un nombre de archivo es lo suficientemente corto, puede encontrar su longitud de bytes en Python con len(filename.encode()).
Marvo
0

Creo que la forma más confiable de determinar esto es con la pathconf(".", _PC_PATH_MAX);función POSIX, que determina la ruta máxima para una ruta determinada.

Como sugiere la función, esto puede variar entre los sistemas de archivos.

Sin embargo, no conozco una utilidad de línea de comando que la exponga. Aquí hay un ejemplo mínimo de C: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
fuente
1
Esto también podría ser de interés: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy
0

Los límites del nombre de ruta dependen del sistema de archivos en uso. La respuesta de jtoscarson cubre ext4, que es predeterminado en Ubuntu, sin embargo, puede usar una variedad de sistemas de archivos en Ubuntu. Para citar la respuesta de WerkkreW en serverfault, estos son algunos de los sistemas de archivos y sus límites:

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

Tenga en cuenta también que varios sistemas de archivos tienen limitaciones en cuanto a qué tipo de carácter puede estar presente en el nombre del archivo. Por ejemplo, los nombres de archivo ext4no pueden contener NULL y /. Ver también, artículo de Wikipedia para comparaciones de sistemas de archivos .

Tenga en cuenta también que los sistemas de archivos de Linux deben tener en cuenta las definiciones POSIX :

3.266 Nombre de ruta

Una cadena de caracteres que se utiliza para identificar un archivo. En el contexto de IEEE Std 1003.1-2001, un nombre de ruta consta de, como máximo, {PATH_MAX} bytes, incluido el byte nulo de terminación. Tiene una barra diagonal inicial opcional, seguida de cero o más nombres de archivo separados por barras diagonales. Un nombre de ruta puede contener opcionalmente una o más barras diagonales finales. Múltiples barras sucesivas se consideran iguales a una barra.

Desde límites.h :

{PATH_MAX}

Número máximo de bytes en un nombre de ruta, incluido el carácter nulo de terminación. Valor mínimo aceptable: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Número máximo de bytes en un nombre de ruta. Valor: 256

Sergiy Kolodyazhnyy
fuente
0

Como dijo @ sergiy-kolodyazhnyy, la longitud máxima del nombre de archivo dependerá del sistema de archivos y la gran mayoría limita la longitud del nombre de archivo a 255 bytes.

Una omisión notable de su carta son los medios ópticos. Si bien las extensiones UDF y Rock Ridge tienen el mismo límite de 255 caracteres para los nombres de archivo, ISO9660 sin Rock Ridge y Joliet tienen límites mucho más estrictos con los que realmente puedes enfrentarte si haces algo como hacer una copia de seguridad de las youtube-dldescargas.

Los nombres de archivo de Joliet están limitados a 64 puntos de código UTF-16 o 103 de ellos si su programa de masterización de disco tiene una opción para romper la especificación de maneras que parecen no causar daño en la práctica.

Del mismo modo, los niveles ISO 9660 2 y 3, sin las extensiones de Rock Ridge, están limitados a nombres de archivo de 31 caracteres o 37 si estás jugando rápido y suelto con la especificación.

ISO 9660: 1999, que es compatible con genisoimage pero no con interfaces como K3b, tiene un límite de 207 bytes (sin Rock Ridge) o 197 bytes (con Rock Ridge).

(Fuente: la página de genisoimagemanual)

En cuanto a la longitud máxima de la ruta , es un gran error. No hay uno para la mayoría de los sistemas de archivos de Linux.

Hay una constante con nombre PATH_MAX, pero es sólo el máximo para determinadas API POSIX , que se puede trabajar alrededor .

Las únicas excepciones consecuentes a esta convención "sin límite en la longitud de ruta" son FAT32 y exFAT (32,760 caracteres Unicode), NTFS y ReFS (32,767 caracteres Unicode), UDF (1,023 bytes) e ISO 9660 (poco claro, pero he visto se indica como 180, 207, 212 o 222 bytes).

Esto se puede demostrar fácilmente ejecutando este pequeño programa Python y luego explorando los directorios resultantes.

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

Mi bash, que muestra la ruta completa en el indicador, tendrá problemas con él. Sin embargo zsh, my , que muestra solo la carpeta actual en el indicador, no tendrá problemas e incluso tiene una función pwdintegrada que puede mostrar la ruta completa de más de 5000 bytes sin problemas.

ssokolow
fuente