Was ist die maximale Länge eines Dateipfads in Ubuntu?

9

Nachdem ich Windows-Systeme lange Zeit verwendet habe, weiß ich, dass zu einem bestimmten Zeitpunkt ein Fehlerfenster angezeigt werden kann, wenn Dateien und Ordnernamen zu lang werden.

Dies ist mir passiert, als ich versucht habe, Dateien mit SFTP von einem Server in einen Ordner in (zum Beispiel) zu sichern:

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

Wie Sie sehen, neige ich manchmal dazu, sehr spezifizierte Ordnerpfade zu erstellen, und wenn ein Dateiname ebenfalls lang ist, kann NTFS ihn möglicherweise nicht auf diese Weise speichern.

Ich mache mir derzeit Sorgen um meine physischen Sicherungen, da der Ordnerpfad auf meinem Sicherungslaufwerk /backups/(drive name)/...allen Dateipfaden hinzugefügt wird .

Gibt es eine solche Grenze (oder eine ähnliche) in ext4 / Ubuntu, auf die ich achten müsste?

Prototype700
quelle
2
Beantwortet über ServerFault: 4k. Es ist ein Betriebssystemlimit, kein FS-Limit. serverfault.com/questions/9546/…
John N

Antworten:

14

Die maximale Dateinamenlänge beträgt 255 Byte. Gefunden in der Wiki-Seite für ext4 .

Und ein maximaler Pfad von 4096 Zeichen. Gefunden in dieser Unix & Linux SE Frage .

Obwohl ich diesen Wiki-Artikel gefunden habe , der keinen maximalen Dateipfad in ext4 angibt.

jtoscarson
quelle
Hallo jtoscarson, danke für deine Antwort. Ich könnte wahrscheinlich versuchen, dies nachzuschlagen, aber möchten Sie erklären, was eine Länge von "255 Bytes" bedeutet? Ich gehe davon aus, dass nicht alle Zeichen unbedingt 8 Bit verbrauchen, das wären also insgesamt mehr als 255 Zeichen, nehme ich an? Oder vielleicht weniger, wenn man bedenkt, dass unterschiedliche Zeichensätze verwendet werden könnten.
Prototype700
Im Allgemeinen ist ein einzelnes Zeichen ein Byte. Ich habe nicht nach der Dokumentation gesucht, aber hier ist ein einfacher Test: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 Das -m zählt Zeichen und das -c zählt Bytes. Der Grund, warum es 7 statt 6 ist, ist das Zeilenendezeichen, das nicht gedruckt wird. Die Gesamtzahl der Zeichen im Dateinamen beträgt also 255.
jtoscarson
1
Bei Verwendung des UTF-8-Gebietsschemas wird 4für zurückgegeben echo -n "💩" | wc -c. Das Erstellen eines Dateinamens mit diesem Namen würde 4 Byte dauern, obwohl dieser Dateiname 1 Graphem lang ist. Ein "Zeichen" ist kein klar definiertes Konzept (normalerweise bedeutet es Byte, Graphem oder UNICODE-Codepunkt).
Mikko Rantalainen
Auf verschlüsselten Dateisystemen beträgt die maximale Dateinamenlänge 143 Byte. Um zu entscheiden, ob ein Dateiname kurz genug ist, können Sie seine Bytelänge in Python mit finden len(filename.encode()).
Marvo
0

Ich glaube, dass der zuverlässigste Weg, dies zu bestimmen, die pathconf(".", _PC_PATH_MAX);POSIX-Funktion ist, die den maximalen Pfad für einen bestimmten Pfad bestimmt.

Wie die Funktion vorschlägt, kann dies zwischen den Dateisystemen variieren.

Ich kenne kein Befehlszeilenprogramm, das es verfügbar macht. Hier ist ein minimales C-Beispiel: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
1
Dies könnte auch von Interesse sein: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy
0

Die Pfadnamenbeschränkungen hängen vom verwendeten Dateisystem ab. Die Antwort von jtoscarson bezieht sich auf ext4, das unter Ubuntu Standard ist. Sie können jedoch unter Ubuntu verschiedene Dateisysteme verwenden. Um die WerkkreW-Antwort auf Serverfehler zu zitieren , sind hier einige der Dateisysteme und ihre Grenzen aufgeführt:

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

Beachten Sie auch, dass verschiedene Dateisysteme Einschränkungen hinsichtlich des Zeichentyps im Dateinamen haben. Beispielsweise dürfen Dateinamen in ext4NULL und nicht enthalten /. Siehe auch Wikipedia-Artikel für Dateisystemvergleiche .

Beachten Sie auch, dass Linux-Dateisysteme POSIX-Definitionen berücksichtigen müssen :

3.266 Pfadname

Eine Zeichenfolge, mit der eine Datei identifiziert wird. Im Kontext von IEEE Std 1003.1-2001 besteht ein Pfadname aus höchstens {PATH_MAX} Bytes, einschließlich des abschließenden Nullbytes. Es hat einen optionalen Anfangs-Schrägstrich, gefolgt von null oder mehr Dateinamen, die durch Schrägstriche getrennt sind. Ein Pfadname kann optional einen oder mehrere nachgestellte Schrägstriche enthalten. Mehrere aufeinanderfolgende Schrägstriche gelten als gleichbedeutend mit einem Schrägstrich.

Von Grenzen.h :

{PATH_MAX}

Maximale Anzahl von Bytes in einem Pfadnamen, einschließlich des abschließenden Nullzeichens. Zulässiger Mindestwert: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Maximale Anzahl von Bytes in einem Pfadnamen. Wert: 256

Sergiy Kolodyazhnyy
quelle
0

Wie @ sergiy-kolodyazhnyy sagte, hängt die maximale Dateinamenlänge vom Dateisystem ab und die überwiegende Mehrheit begrenzt die Dateinamenlängen auf 255 Bytes.

Eine bemerkenswerte Auslassung in seinem Diagramm sind optische Medien. Während UDF und die Rock Ridge-Erweiterungen für Dateinamen dieselbe Beschränkung von 255 Zeichen haben, gelten für ISO9660 ohne Rock Ridge und Joliet viel strengere Beschränkungen, auf die Sie möglicherweise tatsächlich stoßen, wenn Sie beispielsweise youtube-dlDownloads sichern.

Joliet-Dateinamen sind entweder auf 64 UTF-16-Codepunkte oder auf 103 davon beschränkt, wenn Ihr Disc-Mastering-Programm die Option hat, auf eine Weise von der Spezifikation abzuweichen, die in der Praxis keinen Schaden zu verursachen scheint.

Ebenso sind ISO 9660 Level 2 und 3 ohne die Rock Ridge-Erweiterungen auf Dateinamen mit 31 oder 37 Zeichen beschränkt, wenn Sie schnell und locker mit der Spezifikation spielen.

ISO 9660: 1999, das wird von genisoimage unterstützt , aber nicht von Frontends wie K3b, hat eine Grenze von entweder 207 Bytes (ohne Rock Ridge) oder 197 Bytes (mit Rock Ridge).

(Quelle: Die genisoimageManpage)

Die maximale Pfadlänge ist ein großes Missverständnis. Für die meisten Linux-Dateisysteme gibt es keine.

Es gibt eine Konstante mit dem Namen PATH_MAX, aber es ist nur das Maximum für bestimmten POSIX - APIs , die Sie arbeiten , um .

Die einzigen konsequenten Ausnahmen von dieser Konvention "Keine Begrenzung der Pfadlänge" sind FAT32 und exFAT (32.760 Unicode-Zeichen), NTFS und ReFS (32.767 Unicode-Zeichen), UDF (1.023 Byte) und ISO 9660 (unklar, aber ich habe gesehen es wird als 180, 207, 212 oder 222 Bytes angegeben).

Dies kann leicht demonstriert werden, indem dieses kleine Python-Programm ausgeführt und anschließend die resultierenden Verzeichnisse untersucht werden.

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

My bash, das den gesamten Pfad in der Eingabeaufforderung anzeigt, wird Probleme damit haben. Meine zsh, die nur den aktuellen Ordner in der Eingabeaufforderung anzeigt, hat jedoch keine Probleme und verfügt sogar über eine integrierte pwdFunktion, die den gesamten Pfad mit mehr als 5000 Byte problemlos anzeigen kann.

ssokolow
quelle