Quali personaggi sono al sicuro nei nomi di file multipiattaforma per Linux, Windows e OS-X


60

Attualmente, uso un YYMMDD-NAME+PAGEnome per la maggior parte dei miei file. NAMEha spazi convertiti in caratteri di sottolineatura.

Vorrei usare il YYYY-MM-DDformato data, ma non sono sicuro di come separarlo dal nome. A -sembrerebbe strano se il nome iniziasse con un numero. Se uso a _, allora è in conflitto con il carattere di sottolineatura che rappresenta uno spazio.

Quali caratteri sono ragionevolmente sicuri nei nomi dei file che funzionerebbero qui? Sono su Linux, ma potrei condividere file con altre persone (Windows 7, Mac OS X).


... su Unix, Windows, un Amiga 1000?
slhck,

Principalmente Linux moderno.
Martin Ueding,

- il simbolo è sicuro da usare su Windows 7 .. potrebbe essere un altro sistema operativo moderno fare lo stesso .. puoi usare il simbolo meno per separare ..
Niranjan Singh

Risposte:


48

Sommario:

  • Windows: tutto tranne i caratteri di controllo di ASCII e \/:*?"<>|
  • Linux, OS-X: tutto tranne null o /

Su tutte le piattaforme è meglio evitare caratteri non stampabili come i caratteri di controllo ASCII.

finestre

In Windows, Esplora risorse non consente i caratteri di controllo o \/:*?"<>|È possibile utilizzare spazi. Se usi gli spazi, dovrai spesso citare il nome del file quando utilizzato dalla riga di comando (ma per quanto ne so le app della GUI non sono interessate). Il file system di Windows come NTFS apparentemente memorizza la codifica con il nome file, ma UTF-16 è standard.

Alcune parti di Windows fanno distinzione tra maiuscole e minuscole, altre parti non fanno distinzione tra maiuscole e minuscole. È facile creare nomi di file distinti come "Ab" e "ab" su un filesystem Windows NTFS. Questi nomi si riferiscono a file separati che contengono contenuti separati distinti. Tuttavia, sebbene il prompt dei comandi di Windows elencherà felicemente entrambi i file utilizzando dir, non è possibile accedere o manipolare facilmente uno di essi utilizzando comandi come type. Vedi sotto.

Linux, OS-X

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.

Conclusione

Quindi probabilmente potresti tranquillamente usare qualcosa del genere (se non fosse così difficile da scrivere)


Sensibilità maiuscole / minuscole in Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Si noti che non è possibile digitare il contenuto del secondo file, invece il typecomando Windows restituisce semplicemente il contenuto di Ab. Il terzo file sarebbe distinto da aB anche su Linux.

(Windows 10 NTFS).


1
Tutto sommato una buona risposta, ma mi asterrei dall'usare nomi di file negli spazi. Fuggirli correttamente in tutti i contesti è più un problema che un problema. Si noti che Microsoft ha smesso di usare lo spazio nei nomi delle directory di sistema. Se devi indicare i confini delle parole nei nomi, CamelCase funziona bene.
Isaac Rabinovitch il

4
"C: \ Programmi (x86)" esiste ancora in Win8 - non è una directory di sistema? Sono d'accordo che gli spazi possono causare problemi.
RedGrittyBrick,

Lo è, ma può essere rinominato praticamente in qualsiasi cosa. Naturalmente, molti programmi impazziranno se lo rinominerai in "]: \ foobar", ma Windows lo definisce comunque "% programfiles (x86)%".
Marcks Thomas,

2
Qualcosa da tenere a mente qui, il sistema Linux è in grado di considerare maiuscole e minuscole distinte, mentre Windows le considera uguali.
thecoshman,

1
Saresti sorpreso di quanti programmi fanno schifo durante l'analisi. Ecco perché non c'era Windows 9.
Isaac Rabinovitch il

46

Mentre la risposta di RedGrittyBrick è tecnicamente corretta, la sicurezza non è l'unico problema: anche l'usabilità è importante. Penso che una domanda migliore sia "quali personaggi sono buoni da usare in un nome file".

Alcune linee guida potenziali:

  • [0-9a-zA-Z_] - I caratteri alfanumerici e il carattere di sottolineatura vanno sempre bene.
  • \/:*?"<>|e il byte null sono problematici su almeno un sistema e dovrebbero essere sempre evitati.
  • Gli spazi sono usati come separatori di argomenti su molti sistemi, quindi i nomi dei file con spazi dovrebbero essere evitati quando possibile. Altri spazi bianchi (ad esempio schede) ancora di più.
  • I punti e virgola (;) vengono utilizzati per separare i comandi su molti sistemi. I punti e virgola e le virgole (,) vengono utilizzati per separare gli argomenti della riga di comando su (alcune versioni di?) Nella riga di comando di Windows.
  • []()^ #%&!@:+={}'~e [`] tutti hanno significati speciali in molte conchiglie, e sono fastidiosi da aggirare, e quindi dovrebbero essere evitati. Inoltre tendono a sembrare orribili negli URL .
  • Personaggi principali da evitare:
    • Molti programmi da riga di comando usano il trattino [-] per indicare argomenti speciali.
    • * I sistemi basati su nix utilizzano un punto di arresto [.] come carattere principale per file e directory nascosti.
  • Tutto ciò che non si trova nel set ASCII può causare problemi su sistemi più vecchi o più di base (ad esempio alcuni sistemi integrati) e deve essere usato con cura.

Questo in sostanza ti lascia con:

[0-9a-zA-Z -._]

che sono sempre sicuri e non fastidiosi da usare (purché inizi il nome del file con un numero alfanumerico) :)


1
Le parentesi graffe ( []) fanno parte delle espressioni regolari e hanno un significato speciale anche nella shell. Ma non sono così male con cui lavorare, tranne alcuni casi angolari malvagi.
Martin Ueding,

1
Hrm ... Immagino che lo stesso si possa dire (), in realtà.
naught101,

4
In zsh, i caratteri che potrebbero essere interpretati in modo diverso includono []()^;, quindi penso che la risposta giusta potrebbe effettivamente essere la [0-9a-zA-Z.,_-]virgola potrebbe anche essere esclusa solo perché è strano vedere in un nome file, anche se non riesco a pensare a un caso reale in cui potrebbe causare i problemi.
Casey Rodarmor,

sì, li ho rimossi dall'elenco finale
nought101

1
la virgola può essere fastidiosa, provare echo whereami > a,b,cnella finestra del prompt dei comandi di Win10.
RedGrittyBrick l'

4

Potresti:

  1. sostituisci i caratteri di sottolineatura attuali con #(simbolo del correttore di bozze per lo spazio)
  2. sottolineare la data della 'sezione' dal nome del file (o un secondo trattino - più facile da digitare)

Alt-1. iniziale-tappi può sostituire spazi: YYMMDD-HHMM-FileName.extoYYMMDD-HHMM_FileName.ext

Caratteri minimi per una visualizzazione chiara, che si ordina automaticamente con zeri imbottiti per gennaio-settembre (e dal 1 ° al 9 ° mese).

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.