Qual è la lunghezza massima di un percorso di file in Ubuntu?


9

Avendo usato i sistemi Windows per un lungo periodo, so che a un certo punto può apparire una finestra di errore quando i nomi di file e cartelle diventano troppo lunghi.

Questo è successo a me quando ho provato a eseguire il backup dei file con SFTP da un server a una cartella (ad esempio):

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

Come puoi vedere, a volte tendo a creare percorsi di cartelle molto specifici e se anche il nome di un file è lungo, NTFS potrebbe non essere in grado di salvarlo in questo modo.

Attualmente mi preoccupo dei miei backup fisici, poiché il percorso della cartella sull'unità di backup verrà aggiunto /backups/(drive name)/...a tutti i percorsi dei file.

Esiste un limite del genere (o uno simile) in ext4 / Ubuntu che dovrei cercare?


2
Risposta su ServerFault: 4k. È un limite del sistema operativo, non un limite FS. serverfault.com/questions/9546/…
John N

Risposte:


15

La lunghezza massima del nome file è 255 byte. Trovato nella pagina wiki per ext4 .

E un percorso massimo di 4096 caratteri. Trovato in questa domanda Unix e Linux SE .

Sebbene, ho trovato questo articolo wiki che non specifica un percorso di file max in ext4.


Ciao jtoscarson, grazie per la tua risposta. Probabilmente potrei provare a cercarlo, ma ti dispiacerebbe spiegare cosa significa una lunghezza di "255 byte"? Suppongo che non tutti i caratteri utilizzino necessariamente 8 bit, quindi suppongo che siano più di 255 caratteri in totale? O forse meno, considerando diversi set di caratteri potrebbero essere utilizzati.
Prototype700,

In generale, un singolo carattere è un byte. Non ho cercato la documentazione, ma ecco un semplice test: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m sta contando i caratteri e -c sta contando i byte. Il motivo per cui è 7 anziché 6 è il carattere di fine riga che non viene stampato. Quindi i caratteri totali nel nome del file saranno 255.
jtoscarson

1
L'utilizzo delle impostazioni locali UTF-8 restituisce 4per echo -n "💩" | wc -c. La creazione di un nome file chiamato con quel nome richiederebbe 4 byte nonostante il fatto che questo nome file sia lungo 1 grafema. Un "carattere" non è un concetto chiaramente definito (di solito significa byte, grapheme o punto di codice UNICODE).
Mikko Rantalainen,

Sui file system crittografati la lunghezza massima del nome file è 143 byte. Per decidere se un nome file è abbastanza corto puoi trovare la sua lunghezza in byte in Python len(filename.encode()).
Marvo

0

Credo che il modo più affidabile per determinare ciò sia con la pathconf(".", _PC_PATH_MAX);funzione POSIX, che determina il percorso massimo per un determinato percorso.

Come suggerisce la funzione, questo può variare tra i filesystem.

Non conosco un'utilità della riga di comando che la espone. Ecco un esempio C minimo: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296


1
Questo potrebbe anche essere di interesse: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy

0

I limiti del nome percorso dipendono dal filesystem in uso. La risposta di jtoscarson copre ext4 che è di default su Ubuntu, tuttavia è possibile utilizzare una varietà di filesystem su Ubuntu. Per citare la risposta di WerkkreW su serverfault, ecco alcuni dei filesystem e i loro limiti:

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

Nota anche che vari filesystem hanno limitazioni su quale tipo di carattere può essere presente nel nome file. Ad esempio, i nomi dei file in ext4non possono contenere NULL e /. Vedi anche l'articolo di Wikipedia per i confronti del filesystem .

Nota anche che i filesystem Linux devono prendere in considerazione le definizioni POSIX :

3.266 Pathname

Una stringa di caratteri utilizzata per identificare un file. Nel contesto di IEEE Std 1003.1-2001, un percorso è composto al massimo da {PATH_MAX} byte, incluso il byte null di terminazione. Ha una barra iniziale facoltativa, seguita da zero o più nomi di file separati da barre. Un percorso può eventualmente contenere una o più barre finali. Molte barre successive sono considerate uguali a una barra.

Da limits.h :

{} PATH_MAX

Numero massimo di byte in un percorso, incluso il carattere null terminante. Valore minimo accettabile: {_POSIX_PATH_MAX}

{} _POSIX_PATH_MAX

Numero massimo di byte in un percorso. Valore: 256


0

Come diceva @ sergiy-kolodyazhnyy, la lunghezza massima del nome file dipenderà dal file system e la stragrande maggioranza limita la lunghezza del nome file a 255 byte.

Una notevole omissione dal suo grafico sono i supporti ottici. Mentre le estensioni di UDF e Rock Ridge hanno lo stesso limite di 255 caratteri per i nomi dei file, ISO9660 senza Rock Ridge e Joliet hanno entrambi limiti molto più severi che potresti incontrare se stai facendo qualcosa di simile al backup dei youtube-dldownload.

I nomi dei file Joliet sono limitati a 64 codici UTF-16 o 103 se il tuo programma di masterizzazione del disco ha un'opzione per discostarsi dalle specifiche in modi che sembrano non causare alcun danno nella pratica.

Allo stesso modo, i livelli ISO 9660 2 e 3, senza le estensioni di Rock Ridge, sono limitati a nomi di file di 31 caratteri o 37 se stai giocando veloce e sciolto con le specifiche.

ISO 9660: 1999, che è supportato da genisoimage ma non da frontend come K3b, ha un limite di 207 byte (senza Rock Ridge) o 197 byte (con Rock Ridge).

(Fonte: la genisoimagemanpage)

Per quanto riguarda la lunghezza massima del percorso , questo è un grande malinteso. Non ce n'è uno per la maggior parte dei filesystem Linux.

C'è una costante di nome PATH_MAX, ma è solo il massimo per alcune API POSIX , che è possibile lavorare intorno .

Le uniche eccezioni conseguenti a questa convenzione "nessun limite sulla lunghezza del percorso" sono FAT32 ed exFAT (32.760 caratteri Unicode), NTFS e ReFS (32.767 caratteri Unicode), UDF (1.023 byte) e ISO 9660 (poco chiari, ma ho visto indicava 180, 207, 212 o 222 byte).

Ciò può essere facilmente dimostrato eseguendo questo piccolo programma Python e quindi esplorando le directory risultanti.

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

My bash, che mostra l'intero percorso nel prompt, avrà troublr con esso. Tuttavia zsh, my , che visualizza solo la cartella corrente nel prompt, non avrà problemi e ha anche un pwdbuilt-in in grado di visualizzare senza problemi l'intero percorso di oltre 5000 byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.