Dateinamen Längenbeschränkungen unter Linux?

Antworten:

126

Informationen zum Vergleich von Dateisystemen finden Sie auf der Wikipedia-Seite , insbesondere in der Spalte Maximale Dateinamenlänge .

Hier sind einige Dateinamen-Längenbeschränkungen in gängigen Dateisystemen:

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
quelle
45
Die Antwort lautet: Das Limit liegt normalerweise bei 255 Zeichen (für diejenigen, die zu faul sind, um auf diesen Link zu klicken)
doc_id
11
Ihre Antwort sollte mindestens eine Zusammenfassung der relevanten Informationen in dem bereitgestellten Link enthalten. Nicht nur ein Link.
Zrajm
2
@rahmanisback das ist richtig für Dateinamen Grenzen, während Pfadgrenzen in der Regel durch das Betriebssystem definiert sind, nicht FS ( mit Ausnahme einiger seltsamer FSEs wie iso oder ntfs) und, auf Linux, sind 4K
nonchip
2
Eigentlich ging es um beides: D
nonchip 29.06.14
7
Nur darauf hinweisen: Bytes! = Zeichen, besonders wenn Sie UTF-8 verwenden. Sehen Sie hier .
Kris,
87

Ich habe hier gelesen , dass die Pfadlängenbeschränkung in den Systemüberschriften ist. Die maximale Länge von Dateinamen ist ebenfalls festgelegt. Auf meinem System ist es Datei:

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

und C-lang definiert:

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

und noch einiges mehr.

sfp
quelle
10
Tut mir leid, aber ich bin neu hier und kann nicht einmal kommentieren, außer abstimmen. Die vorherige Antwort (von sfp) sollte erhöht werden, da sie die Frage vollständig beantwortet, während die anderen teilweise aus sind. Nochmals, es tut mir leid, dass ich mich an die Regeln gehalten habe, aber ich kann nicht schweigen, wenn die beste Antwort ganz unten steht.
David Balažic
1
Nur darauf hinweisen: Bytes! = Zeichen, besonders wenn Sie UTF-8 verwenden. Sehen Sie hier .
Kris,
1
@ DavidBalažic: Obwohl PATH_MAX unter Linux nur eine Richtlinie ist, unterliegen die meisten zugrunde liegenden Dateisysteme keiner Einschränkung. Dies macht es schwierig, Pfade zu referenzieren, die größer als diese Größe sind. Ich benutze normalerweise "Stücke" von PATH_MAX als Größe.
Rahly
23

Ich beziehe mich auf andere Antworten, bitte stimmen Sie ihnen zu.

Gibt es unter Linux Beschränkungen für Dateinamen oder Pfadlängen?

Ja, die Länge von Dateinamen und Pfadnamen ist begrenzt durch:

So rufen Sie diese Eigenschaften dynamisch ab:

olibre
quelle
Hier ist ein pathconf-Beispiel in C: stackoverflow.com/questions/16285623/…
Ciro Santilli am
20

Und um Zeit zu sparen (und im Gedächtnis zu verankern):

ext2, ext3, ext4, zfs: keine Pfadnamenbeschränkungen; Dateinamenbegrenzung von 255 Byte.

Ivan
quelle
1
Die meisten Programme sind jedoch auf absolute Pfade beschränkt PATH_MAX = 4096. Dies kann umgangen werden, wenn Ihr Programm relative Pfade verwenden kann und Sie zuerst Ihr Arbeitsverzeichnis ändern.
Mikko Rantalainen
Es ist , weil verschiedene POSIX - APIs wie getcwdund realpath(die Sie können in Userspace - Code neu implementieren , indem Sie die Metadaten für das Lesen .und dann Wechsel auf ..und wiederholen , bis Sie das Dateisystem root Hit) verlassen PATH_MAX. ( Quelle )
ssokolow
6

Das sind Dateisystemnamenslängen. "linux" selbst hat auch welche. Zum Beispiel aus bits / stdio_lim.h:

# define FILENAME_MAX 4096
jj33
quelle
Da die extX-Dateisysteme ein niedrigeres Dateinamenlimit haben als im Kernel definiert, würden Sie dieses Limit niemals erreichen, es sei denn, es umfasst auch Pfadnamen, oder?
Ivan
1
so sieht es für mich aus. Es gibt auch PATH_MAX für den Pfad, der 4096 ist, also würde er vor der "unbegrenzten" Pfadgröße auf den Exts getroffen werden ... Ich bin mir nicht sicher, wie das Betriebssystem seine eigenen internen Einschränkungen auflöst und die des FS, nie hatte meine Arme in dieser Tiefe. interessante Frage.
jj33
4096 Zeichen ist ein helluva-Pfadname. Ich bin sicher, es könnte mit einer Neukompilierung ausgelöst werden, aber ehrlich gesagt, / warum sollten Sie Pfadnamen so lange brauchen? /
Avery Payne
Ich bin mir nicht sicher, ob du es brauchst oder nicht. Ich betrachte es eher als Schutz vor böswilligen oder nachlässigen Programmen (ich konnte leicht ein Skript erkennen, das sich schlecht verhält und beginnt, dasselbe Verzeichnis rekursiv zu erstellen. Eigentlich habe ich dieses Skript erstellt, aber es leitete eine Website um und erstellte keine Verzeichnisse ...).
jj33
@AveryPayne Fügt Tags zu Dateien hinzu, damit sie mit einem einfachen Befehl durchsucht werden können locate.
Hubert Kario
3

Es gibt keine Möglichkeit , die maximale Länge von Pfaden unter Linux portabel zu bestimmen. Auf meinem System:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Ich kann aber problemlos Pfade mit mehr als 4096 Zeichen erstellen. Stattdessen PATH_MAXals Untergrenze sehen. Sie können garantiert so lange Pfade erstellen, aber Sie können auch viel längere Pfade erstellen.

Björn Lindqvist
quelle
Ein einfacher portabler Weg, die maximale Länge empirisch zu ermitteln, besteht darin, ein Programm zu schreiben, das immer längere Verzeichnisketten erstellt und feststellt, wo dies fehlschlägt. Sie werden nicht genau wissen, warum dies fehlschlägt (obwohl Sie auf eine von Menschen lesbare Fehlermeldung hoffen würden), aber Sie werden wissen, wie weit Sie sicher gehen können. Denken Sie daran, sowohl die Länge des einzelnen Verzeichnisses als auch die relative und die absolute Länge des Pfadnamens zu überprüfen.
Tripleee
Auch wird zB das Python- os.pathconf()Modul einige Antworten haben; Wenn der Python-Port gut ist, sollten sie vernünftig sein.
Tripleee
2
Dies ist nicht möglich, da einige Dateisysteme keine Grenzen setzen . Es würde eher scheitern, wenn ein Speicherfehler vorliegt, von dem sich jedes Programm nur schwer erholen kann.
Björn Lindqvist
Dies ist die richtige Antwort, mit Ausnahme des @ BjörnLindqvist-Kommentars. PATH_MAX ist nur eine Richtlinie, und 99% der Dateien werden wahrscheinlich innerhalb dieser Grenze liegen.
Rahly
1

Sie sollten immer pathconf oder eine Funktion wie diese verwenden, um den Laufzeitwert für die angegebenen Elemente abzurufen , da auf dieser Seite Folgendes angegeben ist :

Es ist jedoch zu beachten, dass viele der aufgelisteten Grenzwerte nicht invariant sind und dass der Wert des Grenzwerts zur Laufzeit aus den folgenden Gründen von dem in diesem Header angegebenen Wert abweichen kann:

  • Das Limit ist pfadnamenabhängig.

  • Das Limit unterscheidet sich zwischen den Compile- und Runtime-Maschinen.

Aus diesen Gründen kann eine Anwendung die Funktionen fpathconf (), pathconf () und sysconf () verwenden, um den tatsächlichen Wert eines Grenzwerts zur Laufzeit zu ermitteln.

Andy
quelle
0

Es ist in der Header-Datei system limits.h angegeben .

Hier ist eine dieser Dateien:

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

Hier befinden sich Kopien dieser Datei und die von ihnen definierten Werte:

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

Ausgabe:

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