È corretto usare determinati caratteri speciali quando si nominano i nomi dei file in Linux?


18

È corretto utilizzare alcuni caratteri speciali, come +, &, ', .(punto) e ,(virgola), in fondo, nei nomi dei file.

Capisco che puoi usare -e _senza problemi, ma facendo qualche ricerca non sono stato in grado di trovare qualcosa di preciso sugli altri simboli; alcuni dicono che puoi, alcuni dicono che non puoi, e altri dicono che non è "incoraggiato" a usarli (qualunque cosa significhi).


Quali programmi stai usando per lavorare con questi file. Solo i programmi che interpretano alcuni caratteri in modo speciale (ad es. Shell su stringhe non quotate) daranno problemi. Il tuo programma C medio prende tutto ciò che non è NUL senza batter ciglio.
Anthon,

9
Cosa intendi con "corretto"?
David Richerby,

Il problema con l'uso di caratteri speciali in un nome file è che ciò aumenta la possibilità che un pezzo di codice errato gestisca male il nome file. Tuttavia, non credo che nessuno dei personaggi che hai elencato possa causare problemi. Avresti più problemi con gli spazi bianchi, che dovrebbero essere generalmente evitati . E EOL, in particolare, dovrebbe essere evitato a tutti i costi.

Windows ha restrizioni più severe su ciò che può essere presente in un nome file, quindi se c'è qualche possibilità che i file debbano essere utilizzati lì, è qualcosa a cui prestare attenzione.
evilsoup,

Risposte:


28

È corretto utilizzare determinati caratteri speciali, come +, &, ',. (punto) e, (virgola), sostanzialmente, nei nomi dei file.

Sì.

Corretto ma non necessariamente consigliabile o conveniente.

È possibile utilizzare qualsiasi carattere tranne null e/ all'interno di un nome file nei moderni filesystem Unix e Linux.

È possibile utilizzare la punteggiatura ASCII . Alcune utility usano stop ( punto ) e virgole nei nomi dei file che creano.

È possibile utilizzare i caratteri di controllo ASCII , tuttavia ciò non è consigliabile poiché è improbabile che vengano visualizzati in modo accettabile e che siano difficili da usare.

Puoi usare i meta-caratteri della shell come la e commerciale ASCII e l'apostrofo ASCII. Tuttavia, questo è scomodo e richiede che, durante la costruzione dei comandi, presti particolare attenzione a citare o sfuggire a tali personaggi.

È possibile utilizzare caratteri multibyte utilizzando una varietà di codifiche. Spetta alla shell e / o alle utility interpretare e visualizzare correttamente i caratteri non ASCII. È consigliabile limitarsi a una codifica popolare come UTF-8 e impostare le impostazioni internazionali in modo appropriato.

Avrai meno problemi nell'uso dei caratteri stampabili ASCII, limitando l'insieme dei caratteri di punteggiatura a quelli che non sono meta-caratteri shell e non inizi un nome con un trattino (o un arresto - a meno che tu non voglia nascondere il file).


23

Come hanno affermato gli altri, sui moderni sistemi Unix / Linux, i nomi dei file possono contenere qualsiasi carattere tranne \0(NUL) e /(barra).

Inoltre, lo standard POSIX definisce un set di caratteri portatile per i nomi dei file:

3.278 Set di caratteri del nome file portatile

L'insieme di caratteri da cui sono costruiti i nomi dei file portatili.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

Gli ultimi tre caratteri sono rispettivamente i caratteri <periodo>, <underscore> e <hyphen>. Vedi anche Pathname .

L' pathchkutilità di GNU Coreutils verifica questo quando viene chiamata con l' -popzione e l' -Popzione avviserà dei nomi di file vuoti (che non sono validi ma possono essere passati come argomento a pathchk) e dei nomi di file che iniziano con un trattino ( -).


9

La scommessa più sicura è fare riferimento alla voce di Wikipedia per il set di caratteri consentito per qualsiasi sistema operativo. Può essere trovato da qui .

Ad esempio, per la maggior parte dei sistemi basati su unix, il set di caratteri consentito è impostato su 8 bit e il carattere riservato è il carattere null (NUL, '\0'). Tuttavia, non è una buona pratica utilizzare i caratteri speciali nei nomi dei file poiché rappresentano un problema durante la loro rimozione.

Ad esempio, posso avere un nome file come -ramesh.txte provo a rimuoverlo come di seguito.

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

Devo eliminare il file come,

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

Maggiori dettagli possono essere trovati anche da questa risposta .

In Linux e OS-X /è vietato solo il set ASCII stampabile, credo. Alcuni caratteri (come i metacaratteri della shell *?!) causeranno problemi nelle righe di comando e richiederanno che il nome del file sia opportunamente citato o sfuggito.

I filesystem Linux come ext2, ext3 sono agnostici di set di caratteri (penso che lo trattino più o meno come un flusso di byte - solo null e / sono proibiti). Ciò significa che è possibile memorizzare i nomi di file nella codifica UTF-8. Credo che spetti alla shell o ad altra applicazione sapere quale codifica utilizzare per convertire correttamente il nome file per la visualizzazione o l'elaborazione.

Quindi, per concludere, il problema non sta nell'utilizzare i caratteri speciali per i nomi dei file ma su come gestirli.


Per questo motivo ("come gestirli"), utilizzo quasi esclusivamente solo lettere, numeri, caratteri di sottolineatura e punti, anche solo per semplificarmi la vita quando in seguito decido che devo usare i programmi della riga di comando per fare cose sui miei file (che sembra sempre emergere almeno una volta).
phyrfox,

19
Non per sostenere i nomi dei file che iniziano con, -ma solo per essere precisi: 1) sicuramente non hai bisogno delle virgolette attorno a questo nome file, 2) invece di usare l' --argomento speciale potresti fare esattamente ciò che rmsuggerisce lui stesso rm ./-ramesh.txt, quindi non è necessario farlo esattamente come suggerisci.
Michał Politowski,

@ MichałPolitowski Non solo le virgolette non sono necessarie, ma hanno esattamente l'effetto zero.
ctrl-alt-delor,

4

La tua ricerca è quasi giusta. È possibile utilizzare caratteri speciali nei nomi dei file, ma non è consigliabile poiché questi caratteri hanno un significato speciale. Le Convenzioni di denominazione dei file in Linux descrivono anche altre restrizioni sui nomi dei file come "I nomi dei file non devono mai iniziare con un trattino".

Semplice esempio di esecuzione di operazioni da riga di comando con caratteri speciali nei nomi dei file.

Come nota personale, preferirei evitare caratteri speciali nei nomi dei file perché richiedono particolare attenzione quando questi file vengono utilizzati per qualsiasi elaborazione. Quindi, eliminando la preoccupazione di trattare con personaggi speciali dal processo di sviluppo.


1
Così il vostro consiglio è di usare solo -, _e .(DOT) nei nomi dei file?
Chris Klein,

@ChrisKlein, sì, anche se non all'inizio del nome del file.
Simply_Me

Il significato speciale è nel programma (ad es. La shell), non nel nome del file. Quasi tutti i programmi su U & L non si preoccupano di personaggi a tutti finché non c'è un NUL nel nome del file.
Anthon,

@Anthon, sì, la mia shell come descritto nel link.
Simply_Me

2
Come nota personale, consiglierei agli sviluppatori di nominare la cartella principale del loro progetto come "föλder \ t☃" - in modo da notare immediatamente se fanno un bug che si rompe su tali nomi di file, invece di pubblicare codice o binari rotti che gli altri devono aggirare. Usarlo non è un problema, purché sia ​​l'unico che inizia con 'f', il completamento della scheda in qualsiasi shell entrerà nelle cose difficili da scrivere.
Peteris,
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.