Les limites de longueur de nom de fichier sur linux?

Réponses:

126

Voir la page Wikipedia sur la comparaison des systèmes de fichiers , en particulier dans la colonne Longueur maximale du nom de fichier .

Voici quelques limites de longueur de nom de fichier dans les systèmes de fichiers courants:

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
WerkkreW
la source
45
La réponse est: la limite est généralement de 255 caractères (pour ceux qui sont trop paresseux pour cliquer sur ce lien)
doc_id
11
Votre réponse doit contenir au moins un résumé des informations pertinentes dans le lien fourni. Pas seulement un lien.
Zrajm
2
@rahmanisback est correct pour les limites de nom de fichier, alors que les limites de chemin sont généralement définies par le système d'exploitation, et non par FS (à l'exception de certains FS étranges comme iso ou ntfs), et sous Linux, 4K
puce
2
En fait, il s'agissait des deux: D
non
7
Soulignant simplement: octets! = Caractères, surtout si vous utilisez UTF-8. Voir ici .
Kris
87

J'ai lu ici que la limite de longueur de chemin se trouve dans les en-têtes du système. La longueur maximale du nom de fichier est également présente. Sur mon système, c'est le fichier:

  /usr/src/linux-headers-2.6.38-10/include/linux/limits.h

et C-lang définit:

  #define NAME_MAX         255    /* # chars in a file name */
  #define PATH_MAX        4096    /* # chars in a path name including nul */

et quelques autres.

sfp
la source
10
Désolé, mais je suis nouveau ici et je ne peux même pas commenter, sauf le vote. La réponse précédente (par sfp) devrait être augmentée, car elle répond complètement à la question, tandis que les autres sont partiellement désactivées. Encore une fois, désolé d’aller au-delà des règles, mais je ne peux pas rester silencieux lorsque la meilleure réponse est au bas de la liste.
David Balažic
1
Soulignant simplement: octets! = Caractères, surtout si vous utilisez UTF-8. Voir ici .
Kris
1
@ DavidBalažic: Bien que vrai, PATH_MAX sous Linux n'est qu'un guide, la plupart des systèmes de fichiers sous-jacents n'ont pas de limitation. Cela rend difficile de référencer des chemins supérieurs à cette taille. J'utilise habituellement des "morceaux" de PATH_MAX comme taille.
Rahly
23

Je me réfère à d'autres réponses, s'il vous plaît les inviter à voter.

Existe-t-il des limites de longueur de nom de fichier ou de chemin sous Linux?

Oui, les longueurs de nom de fichier et de chemin sont limitées par:

Pour obtenir dynamiquement ces propriétés:

  • Utiliser les fonctions pathconfetfpathconf comme proposé par Michael Aaron Safyan
  • Créer un nom de fichier (ou chemin d'accès) de plus en plus long comme expliqué par dogbane
  • Utilisez la commande getconfproposée par tim , également disponible sous Linux:

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    
olibre
la source
Voici un exemple pathconf en C: stackoverflow.com/questions/16285623/…
Ciro Santilli a été ajouté
20

Et pour gagner du temps (et le garder en mémoire):

ext2, ext3, ext4, zfs: pas de limite de chemin d'accès; Limite de fichier de 255 octets.

Ivan
la source
1
La plupart des programmes sont cependant limités avec des chemins absolus PATH_MAX = 4096. Cela peut être contourné si votre programme est capable d'utiliser des chemins relatifs et que vous modifiez d'abord votre répertoire de travail.
Mikko Rantalainen
C’est parce que diverses API POSIX telles que getcwdet realpath(que vous pouvez réimplémenter dans le code de l’espace utilisateur en lisant les métadonnées ., puis en les changeant ..et en les répétant jusqu’à ce que vous atteigniez la racine du système de fichiers) dépendent PATH_MAX. ( Source )
ssokolow
6

Ce sont des longueurs de noms de système de fichiers. "linux" en a aussi. Par exemple, à partir de bits / stdio_lim.h:

# define FILENAME_MAX 4096
jj33
la source
Donc, étant donné que les systèmes de fichiers extX ont une limite de nom de fichier inférieure à celle définie dans le noyau, vous n’atteindrez jamais cette limite, à moins qu’elle englobe également les noms de chemin, non?
Ivan
1
c'est ce que cela ressemble à moi. Il y a aussi PATH_MAX pour le chemin, qui est 4096, donc il serait touché avant la taille de chemin "illimitée" sur les anciens ... Je ne suis pas sûr de savoir comment le système d'exploitation résout ses propres restrictions internes et celles du FS, jamais mes bras dans cette profondeur. question intéressante cependant.
Jj33
4096 caractères est un nom de chemin helluva. Je suis sûr que cela pourrait être élevé avec une recompilation, mais honnêtement, / pourquoi auriez-vous besoin de noms de chemins aussi longs? /
Avery Payne
Je ne suis pas sûr que vous en ayez besoin ou non. Je le vois plutôt comme une protection contre les programmes malveillants ou négligents (je pouvais facilement voir un script qui se comporte mal et commence à créer le même répertoire de manière récursive. En fait, j’ai créé ce script, mais il redirige un site Web et ne crée pas de répertoire ...)
Jj33
@AveryPayne Pour ajouter des balises aux fichiers afin qu'ils puissent être recherchés à l'aide d'un simple locate.
Hubert Kario
3

Il n’existe aucun moyen de déterminer la longueur maximale des chemins sous Linux de manière portable. Sur mon système:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Mais je peux facilement créer des chemins beaucoup plus longs que 4096 caractères. Voyez plutôt PATH_MAXcomme une limite inférieure. Vous êtes assuré de pouvoir créer des chemins aussi longs, mais vous pourrez également en créer de plus longs.

Björn Lindqvist
la source
Un moyen simple et portable de trouver empiriquement la longueur maximale consiste à écrire un programme qui crée des chaînes de répertoires de plus en plus longues et à voir où il échoue. Vous ne saurez pas exactement pourquoi cela échoue (bien que vous souhaitiez un message d'erreur suggestif lisible par l'homme), mais vous saurez jusqu'où vous pouvez aller en toute sécurité. N'oubliez pas de vérifier la longueur du répertoire individuel, la longueur du chemin d'accès relatif et la longueur du chemin d'accès absolu.
tripleee
Aussi, par exemple, le os.pathconf()module Python aura des réponses; si le port Python est bon, ils devraient être raisonnables.
tripleee
2
Vous ne pouvez pas parce que certains systèmes de fichiers n'imposent aucune limite . Il serait préférable d'échouer avec une erreur de manque de mémoire dont tout programme aurait du mal à se remettre.
Björn Lindqvist le
C'est la bonne réponse, sauf que cela est dû au commentaire de @ BjörnLindqvist. PATH_MAX est juste une directive, et 99% des fichiers seront probablement dans cette limite.
Rahly
1

Vous devez toujours utiliser pathconf ou une fonction comme celle-ci pour obtenir la valeur d'exécution des éléments spécifiés, comme le dit cette page :

Il convient toutefois de noter que bon nombre des limites énumérées ne sont pas invariantes et que, lors de l'exécution, la valeur de la limite peut différer de celle indiquée dans cet en-tête, pour les raisons suivantes:

  • La limite dépend du nom du chemin.

  • La limite diffère entre les ordinateurs de compilation et d'exécution.

Pour ces raisons, une application peut utiliser les fonctions fpathconf (), pathconf () et sysconf () pour déterminer la valeur réelle d'une limite au moment de l'exécution.

Andy
la source
0

Il est spécifié dans le fichier d'en-tête système limits.h .

Voici l'un de ces fichiers:

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 */
...

Voici où se trouvent les copies de ce fichier et les valeurs qu’elles définissent:

find /usr | grep limits.h | xargs -I {} grep -H 'NAME_MAX' {}

Sortie:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
Bohdan Voloshyn
la source