Quelle est la longueur maximale d'un chemin de fichier dans Ubuntu?


9

Ayant utilisé les systèmes Windows depuis longtemps, je sais qu'à un certain moment, une fenêtre d'erreur peut apparaître lorsque les noms de fichiers et de dossiers deviennent trop longs.

Cela m'est arrivé lorsque j'ai essayé de sauvegarder des fichiers avec SFTP d'un serveur vers un dossier (par exemple):

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

Comme vous pouvez le voir, j'ai tendance à créer des chemins de dossier très spécifiques parfois et si un nom de fichier est également long, NTFS pourrait ne pas être en mesure de l'enregistrer de cette façon.

Je m'inquiète actuellement de mes sauvegardes physiques, car le chemin du dossier sur mon lecteur de sauvegarde s'ajoutera /backups/(drive name)/...à tous les chemins de fichiers.

Existe-t-il une telle limite (ou une limite similaire) dans ext4 / Ubuntu que je devrais rechercher?


2
Répondu sur ServerFault: 4k. C'est une limite de système d'exploitation, pas une limite FS. serverfault.com/questions/9546/…
John N

Réponses:


15

La longueur maximale du nom de fichier est de 255 octets. Trouvé dans le page wiki d'ext4 .

Et un chemin maximum de 4096 caractères. Trouvé dans cette question Unix et Linux SE .

Cependant, j'ai trouvé cet article wiki qui ne spécifie pas de chemin de fichier max dans ext4.


Salut jtoscarson, merci pour votre réponse. Je pourrais probablement essayer de chercher ceci, mais voudriez-vous expliquer ce que signifie une longueur de "255 octets"? Je suppose que tous les caractères n'utilisent pas nécessairement jusqu'à 8 bits, ce qui représenterait plus de 255 caractères au total, je suppose? Ou peut-être moins, étant donné que différents jeux de caractères pourraient être utilisés.
Prototype700

De manière générale, un seul caractère est un octet. Je n'ai pas cherché la documentation, mais voici un test simple: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m compte les caractères et -c compte les octets. La raison pour laquelle il est 7 au lieu de 6 est le caractère de fin de ligne qui n'est pas imprimé. Le nombre total de caractères dans le nom de fichier sera donc de 255.
jtoscarson

1
L'utilisation des paramètres régionaux UTF-8 renvoie 4pour echo -n "💩" | wc -c. La création d'un nom de fichier appelé avec ce nom prendrait 4 octets malgré le fait que ce nom de fichier ait 1 graphe. Un "caractère" n'est pas un concept clairement défini (il signifie généralement octet, graphème ou point de code UNICODE).
Mikko Rantalainen

Sur les systèmes de fichiers chiffrés, la longueur maximale du nom de fichier est de 143 octets. Pour décider si un nom de fichier est suffisamment court, vous pouvez trouver sa longueur d'octet en Python avec len(filename.encode()).
Marvo

0

Je crois que le moyen le plus fiable de déterminer cela est avec la pathconf(".", _PC_PATH_MAX);fonction POSIX, qui détermine le chemin maximum pour un chemin donné.

Comme la fonction le suggère, cela peut varier selon les systèmes de fichiers.

Je ne connais pas d'utilitaire de ligne de commande qui l'expose cependant. Voici un exemple C minimal: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296


1
Cela pourrait également être intéressant: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy

0

Les limites de chemin dépendent du système de fichiers utilisé. La réponse de jtoscarson couvre ext4 qui est par défaut sur Ubuntu, cependant vous pouvez utiliser une variété de systèmes de fichiers sur Ubuntu. Pour citer la réponse de WerkkreW sur la défaillance du serveur, voici quelques-uns des systèmes de fichiers et leurs limites:

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

Notez également que divers systèmes de fichiers ont des limitations quant au type de caractère pouvant être présent dans le nom de fichier. Par exemple, les noms de fichiers dans ext4ne peuvent pas contenir NULL et /. Voir aussi l'article Wikipedia pour les comparaisons de systèmes de fichiers .

Notez également que les systèmes de fichiers Linux doivent prendre en considération les définitions POSIX :

3.266 Chemin d'accès

Chaîne de caractères utilisée pour identifier un fichier. Dans le contexte de IEEE Std 1003.1-2001, un nom de chemin se compose, au plus, de {PATH_MAX} octets, y compris l'octet nul final. Il a une barre oblique de début facultative, suivie de zéro ou plusieurs noms de fichiers séparés par des barres obliques. Un chemin d'accès peut éventuellement contenir une ou plusieurs barres obliques de fin. Plusieurs barres obliques successives sont considérées comme étant identiques à une barre oblique.

De limits.h :

{PATH_MAX}

Nombre maximal d'octets dans un chemin d'accès, y compris le caractère nul de fin. Valeur minimale acceptable: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Nombre maximal d'octets dans un nom de chemin. Valeur: 256


0

Comme l'a dit @ sergiy-kolodyazhnyy, la longueur maximale du nom de fichier dépendra du système de fichiers et la grande majorité limitera la longueur des noms de fichiers à 255 octets.

Une omission notable de sa carte est les supports optiques. Alors que UDF et les extensions Rock Ridge ont la même limite de 255 caractères pour les noms de fichiers, ISO9660 sans Rock Ridge et Joliet ont tous deux des limites beaucoup plus strictes que vous pourriez réellement rencontrer si vous faites quelque chose comme la sauvegardeyoutube-dl téléchargements.

Les noms de fichiers Joliet sont limités à 64 points de code UTF-16 ou à 103 d'entre eux si votre programme de mastering de disque a la possibilité de rompre avec les spécifications d'une manière qui ne semble pas causer de préjudice en pratique.

De même, les niveaux ISO 9660 2 et 3, sans les extensions Rock Ridge, sont limités à des noms de fichiers de 31 caractères ou 37 si vous jouez rapidement et librement avec la spécification.

ISO 9660: 1999, qui est prise en charge par genisoimage mais pas par des frontaux comme K3b, a une limite de 207 octets (sans Rock Ridge) ou 197 octets (avec Rock Ridge).

(Source: la genisoimagepage de manuel)

Quant à la longueur maximale du chemin , c'est une grosse idée fausse. Il n'y en a pas pour la plupart des systèmes de fichiers Linux.

Il y a une constante du nom PATH_MAX, mais il est seulement le maximum pour certaines API POSIX , que vous pouvez travailler autour .

Les seules exceptions consécutives à cette convention "aucune limite sur la longueur du chemin" sont FAT32 et exFAT (32 760 caractères Unicode), NTFS et ReFS (32 767 caractères Unicode), UDF (1 023 octets) et ISO 9660 (peu clair, mais j'ai vu il indique 180, 207, 212 ou 222 octets).

Cela peut être facilement démontré en exécutant ce petit programme Python, puis en explorant les répertoires résultants.

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

My bash, qui affiche tout le chemin dans l'invite, aura des problèmes avec cela. Cependant, mon zsh, qui n'affiche que le dossier actuel dans l'invite, n'aura aucun problème et a même un pwdintégré qui peut afficher l'intégralité du chemin de 5000 + octets sans problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.