Como os sistemas de arquivos que não diferenciam maiúsculas de minúsculas exibem nomes de arquivos em maiúsculas e minúsculas?

12

Essa pergunta me ocorreu outro dia, quando eu estava trabalhando em um projeto de desenvolvimento que se baseia em uma estrutura opinativa em relação aos nomes de arquivos. A estrutura (irrelevante aqui) queria ver o primeiro nome de arquivo em maiúsculas. Isso me fez pensar.

Em um sistema de arquivos que não diferencia maiúsculas de minúsculas, diga extFAT ou HFS + (especificamente que não diferenciam maiúsculas de minúsculas) como o sistema de arquivos fornece acesso ao mesmo arquivo com as versões em maiúsculas e minúsculas do nome do arquivo.

Por exemplo:

$ 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

Todos esses comandos serão resolvidos para o mesmo diretório. Esse comportamento, especificamente a saída de pwdapenas uma função bashdesse caso, está apenas me mostrando o que ele pensa que eu quero ver?

Outro exemplo:

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

O sistema de arquivos aqui relata o caso do nome do arquivo original criado pelo usuário ou programa.

Em que ponto da pilha do sistema de arquivos o nome do arquivo legível por humanos é preservado conforme foi criado (por exemplo, maiúsculas e minúsculas) para que possa ser acessado por qualquer combinação dos caracteres ASCII maiúsculos e minúsculos corretos? Isso é apenas um truque de regex em algum lugar ou algo mais está acontecendo?

EDIT: Parece que o comportamento que eu estou curioso sobre se encontra em caso de preservação de sistemas de arquivos de maiúsculas e minúsculas depois de mais algumas pesquisas ...

111 ---
fonte
Não estou escrevendo isso como resposta, porque não tenho mais certeza, mas acredito que você não pode ter ~ / Documents e ~ / documents nesse sistema de arquivos. Mas quando você cd / Documents ou ~ / documenta, você está indo para o mesmo lugar e seu shell está "se saindo bem" lembrando o que você digitou. O outro lado é que alguns FS armazenam da maneira que foram criados em um aux. pedaço de dados. Por exemplo, armazenando ~ / Documents em uma tabela de pesquisa, mas gravando no FS como ~ / documents. Basicamente, criando uma ilusão de que o sistema de arquivos se importa com a caixa quando não.
coteyr
Pelo que observei, no caso de um diretório conter dois nomes de arquivos idênticos, exceto para maiúsculas e minúsculas, os sistemas de arquivos que não diferenciam maiúsculas de minúsculas podem responder a uma solicitação de um determinado arquivo selecionando arbitrariamente um. Tais situações podem surgir se as regras para conversão em maiúsculas / minúsculas mudarem após a criação de um arquivo.
Supercat
Informações legais sobre a preservação da natureza do caso do NTFS: superuser.com/questions/364057/why-is-ntfs-case-sensitive
Canadian Luke

Respostas:

14

Um sistema de arquivos que não diferencia maiúsculas de minúsculas apenas significa que sempre que o sistema de arquivos precisa perguntar "A se refere ao mesmo arquivo / diretório que B?" ele compara os nomes de arquivos / diretórios que ignoram as diferenças em maiúsculas / minúsculas (exatamente o que as diferenças em maiúsculas / minúsculas contam depende do sistema de arquivos - não é óbvio quando você ultrapassa o ASCII). Um sistema de arquivos com distinção entre maiúsculas e minúsculas não ignora essas diferenças.

Um sistema de arquivos que preserva maiúsculas e minúsculas armazena os nomes dos arquivos conforme indicado. Um sistema de arquivos sem preservação de caso não; normalmente converte todas as letras em maiúsculas antes de armazená-las (teoricamente, pode usar letras minúsculas ou RaNsOm NoTe, ou qualquer outra coisa, mas o AFAIK todas as letras do mundo real usam maiúsculas).

Você pode juntar esses dois atributos em qualquer combinação. Não tenho certeza se você pode encontrar sistemas de arquivos que não diferenciam maiúsculas de minúsculas, mas certamente pode criar um. Todas as outras combinações existem ou existiram em sistemas reais, no entanto.

Portanto, um sistema de arquivos que não faz distinção entre maiúsculas e minúsculas (o tipo de sistema de arquivos que não diferencia maiúsculas de minúsculas hoje em dia) armazenará e retornará nomes de arquivos em qualquer capitalização que você os criou ou os renomeou pela última vez, mas ao comparar dois nomes de arquivo (para verificar se um existe, para abrir um, para excluir um etc.) ignorará as diferenças entre maiúsculas e minúsculas.

Quando você usa um sistema de arquivos que não diferencia maiúsculas de minúsculas em uma caixa Unix, vários utilitários fazem coisas estranhas porque o Unix tradicionalmente usa sistemas de arquivos que diferenciam maiúsculas de minúsculas - para que não esperem Document1e document1sejam o mesmo arquivo.

No pwdcaso, o que você está vendo é que, por padrão, apenas gera o caminho que você realmente usou para chegar ao diretório. Então, se você chegou lá via cd DirName, ele será usado DirNamena saída. Se você chegou lá via DiRnAmE, verá DiRnAmEna saída. O Bash faz isso acompanhando como você chegou ao seu diretório atual na $PWDvariável de ambiente. Principalmente, isso é para links simbólicos (se você estiver cdem um link simbólico, verá o link simbólico no seu pwd, mesmo que ele não faça parte do caminho para o diretório atual). Mas também fornece o comportamento um tanto estranho que você observa em sistemas de arquivos que não diferenciam maiúsculas de minúsculas. Eu suspeito que pwd -Pvocê fornecerá o nome do diretório usando o caso armazenado no disco, mas não foi testado.

derobert
fonte
Eu poderia saber que você me venceu neste! (upvoted)
Fabby