Como os sistemas de arquivos insensíveis a maiúsculas e 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 dependia de uma estrutura opinativa com relação aos nomes de arquivos. A estrutura (irrelevante aqui) queria ver nomes de arquivos em maiúsculas. Isso me fez pensar.

Em um sistema de arquivos que não diferencia maiúsculas de minúsculas, digamos extFAT ou HFS + (especificamente sem distinção entre maiúsculas e minúsculas), como o sistema de arquivos fornece acesso ao mesmo arquivo com ambas versões 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 no mesmo diretório. Esse comportamento, especificamente a saída de pwd é apenas uma função de bash , neste caso, apenas me mostrando o que ele acha que eu quero ver?

Outro exemplo:

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

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

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

Perdoe minha ignorância se esta é uma pergunta idiota (ou uma série deles: p), mas estou curioso sobre o que está acontecendo aqui.

EDITAR: Parece que o comportamento sobre o qual estou curioso é encontrado em sistemas de arquivos que preservam maiúsculas e minúsculas sem distinção entre maiúsculas e minúsculas após algumas pesquisas ...

    
por datUser 22.04.2015 / 22:18

1 resposta

14

Um sistema de arquivos que não diferencia maiúsculas e minúsculas apenas significa que sempre que o sistema de arquivos tiver que perguntar, "A referencia o mesmo arquivo / diretório que B?" ele compara os nomes de arquivos / diretórios ignorando diferenças em maiúsculas / minúsculas (exatamente o que a contagem de diferenças entre maiúsculas e minúsculas 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 o caso armazena os nomes dos arquivos como dados. Um sistema de arquivos que não preserva o caso não possui; normalmente, ele converterá todas as letras em letras maiúsculas antes de armazená-las (teoricamente, poderia usar letras minúsculas ou caso do RaNsOm NoTe, ou qualquer outra coisa, mas AFAIK todas as do mundo real usadas em maiúsculas).

Você pode colocar esses dois atributos juntos 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 você certamente poderia criar um. Todas as outras combinações existem ou existiam em sistemas reais.

Portanto, um sistema de arquivos que não diferencia maiúsculas de minúsculas (o tipo mais comum de sistema de arquivos que não diferencia maiúsculas e minúsculas) irá armazenar e retornar nomes de arquivos em qualquer capitalização que você os criou ou renomeou, mas ao comparar dois nomes de arquivos verifique se existe algum, para abrir um, para deletar um, etc.) ele irá ignorar diferenças de casos.

Quando você usa um sistema de arquivos que não diferencia maiúsculas de minúsculas em uma caixa Unix, vários utilitários farão coisas estranhas porque o Unix tradicionalmente usa sistemas de arquivos que diferenciam maiúsculas de minúsculas - portanto, eles não esperam que Document1 e document1 sejam o mesmo arquivo.

No caso pwd , o que você está vendo é que, por padrão, apenas exibe o caminho que você realmente usou para chegar ao diretório. Então, se você chegar lá por meio de cd DirName , ele usará DirName na saída. Se você chegou lá via DiRnAmE , você verá DiRnAmE na saída. Bash faz isso mantendo um registro de como você chegou ao seu diretório atual na variável de ambiente $PWD . Principalmente, isso é para links simbólicos (se vocêcd em um link simbólico, verá o link simbólico em pwd , mesmo que não faça parte do caminho para seu diretório atual). Mas também dá o comportamento um pouco estranho que você observa em sistemas de arquivos insensíveis a maiúsculas e minúsculas. Eu suspeito que pwd -P lhe dará o nome do diretório usando o caso armazenado no disco, mas não testei.

    
por 22.04.2015 / 22:50