In che modo i filesystem senza distinzione tra maiuscole e minuscole visualizzano i nomi dei file sia maiuscoli che minuscoli?


12

Questa domanda mi è venuta in mente l'altro giorno mentre stavo lavorando a un progetto di sviluppo che si basa su un framework supponente per quanto riguarda i nomi dei file. Il framework (qui non pertinente) voleva vedere i nomi dei file in maiuscolo. Questo mi ha fatto pensare.

Su un file system senza distinzione tra maiuscole e minuscole, dire extFAT o HFS + (in particolare senza distinzione tra maiuscole e minuscole) in che modo il file system fornisce l'accesso allo stesso file con entrambe le versioni maiuscole e minuscole del nome file.

Per esempio:

$ cd ~/Documents
$ pwd
/home/derp/Documents

$ cd ../documents
$ pwd
/home/derp/documents

$ cd ../docuMents
$ pwd
/home/derp/docuMents

$ cd ../DOCUMENTS
$ pwd
/home/derp/DOCUMENTS

$ cd ../documentS
$ pwd
/home/derp/documentS

Tutti questi comandi si risolveranno nella stessa directory. Questo comportamento, in particolare l'output di pwduna funzione di bashquesto caso, mi sta solo mostrando ciò che pensa di voler vedere?

Un altro esempio:

$ ls ~/Documents
Derp.txt    another.txt    whatThe.WORLD

Il file system qui riporta il caso del nome file originale come creato dall'utente o dal programma.

A che punto dello stack del filesystem viene conservato il nome file leggibile dall'uomo quando è stato creato (es. Maiuscolo e minuscolo) in modo che sia possibile accedervi da qualsiasi combinazione dei caratteri ASCII maiuscoli e minuscoli corretti? È solo un trucco regex da qualche parte o c'è qualcos'altro che sta succedendo?

EDIT: Sembra che il comportamento mi incuriosisce è trovato in -preservare caso file system case-insensitive, dopo qualche ricerca ...


Non scrivo questo come una risposta perché non ne sono più sicuro ma credo che non si possano avere ~ / Documenti e ~ / documenti in quel file system. Ma quando cd ~ / Documents o ~ / documenti stai andando nello stesso posto e la tua shell "suona bene" ricordando ciò che hai digitato. L'altro lato è che alcuni FS memorizzano il modo in cui è stato creato in un aux. blocco di dati. Ad esempio, la memorizzazione di ~ / Documents in una tabella di ricerca ma la scrittura su FS come ~ / documenti. Fondamentalmente creando un'illusione che il file system si preoccupa del case quando non lo fa.
Coteyr,

Da quanto ho osservato, nel caso in cui una directory contenga due nomi di file identici, ad eccezione del caso, i file system senza distinzione tra maiuscole e minuscole possono rispondere a una richiesta per un determinato file selezionandone arbitrariamente uno. Tali situazioni possono sorgere se le regole per la conversione maiuscole / minuscole cambiano dopo la creazione di un file.
supercat

Informazioni interessanti sulla custodia di NTFS che preserva la natura: superuser.com/questions/364057/why-is-ntfs-case-sensitive
Canadian Luke,

Risposte:


14

Un filesystem senza distinzione tra maiuscole e minuscole significa che ogni volta che il filesystem deve chiedere "A fa riferimento allo stesso file / directory di B?" confronta i nomi di file / directory ignorando le differenze tra maiuscole / minuscole (esattamente ciò che conta le differenze maiuscole / minuscole dipende dal filesystem - non è ovvio una volta superato ASCII). Un filesystem con distinzione tra maiuscole e minuscole non ignora tali differenze.

Un filesystem che preserva i casi memorizza i nomi dei file come indicato. Un file system senza maiuscole / minuscole no; in genere convertirà tutte le lettere in maiuscolo prima di memorizzarle (teoricamente, potrebbe usare lettere minuscole o RaNsOm NoTe, o qualsiasi altra cosa, ma AFAIK tutte quelle del mondo reale usavano lettere maiuscole).

Puoi mettere insieme questi due attributi in qualsiasi combinazione. Non sono sicuro se riesci a trovare filesystem con distinzione tra maiuscole e minuscole, ma puoi sicuramente crearne uno. Tuttavia, tutte le altre combinazioni esistono o sono esistite nei sistemi reali.

Quindi un filesystem che non fa distinzione tra maiuscole e minuscole (il tipo più comune di filesystem senza distinzione tra maiuscole e minuscole al giorno d'oggi) memorizzerà e restituirà i nomi dei file in qualunque maiuscolo li abbia creati o li abbia rinominati per ultimi, ma quando si confrontano due nomi di file (per verificare se uno esiste, per aprirne uno, per eliminarne uno, ecc.) ignorerà le differenze tra maiuscole e minuscole.

Quando si utilizza un filesystem senza distinzione tra maiuscole e minuscole su una scatola Unix, varie utilità faranno cose strane perché Unix utilizza tradizionalmente filesystem con distinzione tra maiuscole e minuscole, quindi non si aspettano Document1che document1siano lo stesso file.

Nel pwdcaso, quello che stai vedendo è che per impostazione predefinita genera solo il percorso che hai effettivamente utilizzato per raggiungere la directory. Quindi, se ci sei arrivato cd DirName, lo userà DirNamenell'output. Se ci sei arrivato via DiRnAmE, vedrai DiRnAmEnell'output. Bash lo fa tenendo traccia di come sei arrivato alla tua directory corrente nella $PWDvariabile d'ambiente. Principalmente questo è per i collegamenti simbolici (se ti trovi cdin un collegamento simbolico, vedrai il collegamento simbolico nel tuo pwd, anche se in realtà non fa parte del percorso della directory corrente). Ma dà anche il comportamento un po 'strano che osservi su filesystem insensibili al maiuscolo / minuscolo. Ho il sospetto che pwd -Pti darà il nome della directory usando il caso memorizzato sul disco, ma non ho testato.


Forse avrei saputo che mi hai battuto per questo! (votato)
Fabby,
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.