As extensões de arquivos têm algum propósito (para o sistema operacional)?

65

O Linux determina o tipo de um arquivo por meio de um código no cabeçalho do arquivo. Não depende de extensões de arquivo para saber qual software deve ser usado para abrir o arquivo.

É disso que eu me lembro da minha educação. Por favor, corrija-me caso eu esteja errado!

Trabalhando um pouco com os sistemas Ubuntu recentemente: vejo muitos arquivos nos sistemas com extensões como .sh , .txt , .o , .c

Agora estou pensando: essas extensões são destinadas apenas para humanos? Então, é preciso ter uma ideia de que tipo de arquivo é?

Ou eles têm algum propósito para o sistema operacional também?

    
por mizech 27.07.2016 / 08:46

7 respostas

36
  

O Linux determina o tipo de um arquivo por meio de um código no cabeçalho do arquivo. Não depende de extensões de arquivos para saber com o software é usar para abrir o arquivo.

     

É disso que eu me lembro da minha educação. Por favor, corrija-me caso eu esteja errado!

  • corretamente lembrado.
  

Essas extensões são destinadas apenas para humanos?

  • Sim, com um mas.

Quando você interage com outros sistemas operacionais que dependem do fato de as extensões serem o que são, é a ideia mais inteligente de usá-las.

No Windows, o software de abertura é anexado às extensões.

Abrir um arquivo de texto chamado "arquivo" é mais difícil no Windows do que abrir o mesmo arquivo chamado "arquivo.txt" (você precisará alternar a caixa de diálogo Abrir arquivo de *.txt para *.* a cada vez). O mesmo vale para arquivos de texto separados por TAB e ponto-e-vírgula. O mesmo vale para importar e exportar e-mails (extensão .mbox).

Em particular, quando você codifica software. Abrir um arquivo chamado "software1" que é um arquivo HTML e "software2" que é um arquivo JavaScript se torna mais difícil comparado a "software.html" e "software.js".

Se existe um sistema no Linux onde as extensões de arquivo são importantes, eu chamaria isso de bug. Quando o software depende de extensões de arquivo, isso é explorável. Usamos uma diretiva de intérprete para identificar o que é um arquivo ("os primeiros dois bytes em um arquivo podem ser os caracteres" # ! ", que constituem um número mágico (hexadecimais 23 e 21, os valores ASCII de" # "e"! "), muitas vezes referidos como shebang,").

O problema mais famoso com as extensões de arquivo foi LOVE-LETTER-FOR-YOU.TXT.vbs no Windows. Este é um script básico visual sendo mostrado no explorador de arquivos como um arquivo de texto.

No Ubuntu, quando você inicia um arquivo do Nautilus, você recebe um aviso sobre o que ele fará. A execução de um script do Nautilus onde ele deseja iniciar algum software no qual ele deve abrir o gEdit é um problema óbvio e recebemos um aviso sobre ele.

Na linha de comando, quando você executa algo, você pode ver visualmente qual é a extensão. Se ele terminar em .vbs eu começaria a suspeitar (não que .vbs seja executável no Linux. Pelo menos não sem mais esforço;)).

    
por Rinzwind 27.07.2016 / 09:01
63

Não há 100% de resposta em preto ou branco aqui.

Normalmente, o Linux não depende de nomes de arquivos (e extensões de arquivos, ou seja, a parte do nome do arquivo após o período normalmente anterior) e determina o tipo de arquivo examinando os primeiros bytes de seu conteúdo e comparando isso com uma lista de números mágicos conhecidos.

Por exemplo, todos os arquivos de imagem Bitmap (geralmente com extensão de nome .bmp ) devem começar com as letras BM em seus dois primeiros bytes. Scripts na maioria das linguagens de script como Bash, Python, Perl, AWK, etc. (basicamente tudo o que trata de linhas que começam com # como comentário) podem conter um shebang como #!/bin/bash como primeira linha. Este comentário especial diz ao sistema com qual aplicativo abrir o arquivo.

Normalmente, o sistema operacional depende do conteúdo do arquivo e não do seu nome para determinar o tipo de arquivo, mas afirmar que as extensões de arquivo nunca são necessárias no Linux é apenas metade da verdade.

Os aplicativos podem, é claro, implementar suas verificações de arquivos da maneira que quiserem, o que inclui verificar o nome e a extensão do arquivo. Um exemplo é o Eye of Gnome ( eog , visualizador de imagens padrão) que determina o formato da imagem pela extensão do arquivo e lança um erro se não corresponder ao conteúdo. Se isso é um bug ou um recurso pode ser discutido ...

No entanto, até mesmo algumas partes do sistema operacional dependem de extensões de nome de arquivo, por exemplo, ao analisar seus arquivos de fontes de software em /etc/apt/sources.list.d/ - apenas arquivos com a extensão *.list , todos os outros são ignorados. Talvez não seja usado principalmente para determinar o tipo de arquivo aqui, mas para ativar / desativar a análise de alguns arquivos, mas ainda é uma extensão de arquivo que afeta como o sistema trata um arquivo.

E, claro, o usuário humano tira mais proveito das extensões de arquivo, pois isso torna óbvio o tipo de arquivo e também permite vários arquivos com o mesmo nome base e extensões diferentes, como site.html , site.php , site.js , site.css etc. A desvantagem é, obviamente, que a extensão do arquivo e o tipo / conteúdo real do arquivo não precisam necessariamente corresponder.

Além disso, é necessário para a interoperabilidade entre plataformas, como, por exemplo, O Windows não saberá o que fazer com um arquivo readme , mas apenas um readme.txt .

    
por Byte Commander 27.07.2016 / 09:22
22

Como mencionado por outros, no Linux é usado um método de diretiva de intérprete (armazenando alguns metadados em um arquivo como um cabeçalho ou número mágico para que o interpretador correto possa ler) em vez do método de associação de extensão de nome de arquivo usado pelo Windows .

Isso significa que você pode criar um arquivo com quase qualquer nome que desejar ... com algumas exceções

No entanto

Gostaria de acrescentar uma palavra de cautela.

Se você tiver alguns arquivos em seu sistema de um sistema que usa associação de nome de arquivo, os arquivos podem não ter esses números mágicos ou cabeçalhos. Extensões de nome de arquivo são usadas para identificar esses arquivos por aplicativos que são capazes de lê-los e você pode ter alguns efeitos inesperados se você renomear esses arquivos. Por exemplo:

Se você renomear um arquivo My Novel.doc para My-Novel , o Libreoffice ainda poderá abri-lo, mas ele será aberto como 'Sem título' e você terá que nomear novamente para salvá-lo (o Libreoffice adiciona um extensão por padrão, então você teria dois arquivos My-Novel e My-Novel.odt , o que poderia ser chato)

Mais seriamente, se você renomear um arquivo My Spreadsheet.xlsx para My-Spreadsheet, tente abri-lo com xdg-open My-Spreadsheet , você obterá isso (porque na verdade é um arquivo compactado):

E se você renomear um arquivo My Spreadsheet.xls para My-Spreadsheet , quando você xdg-open My-Spreadsheet receber um erro dizendo

  

local de abertura do erro: Nenhum aplicativo está registrado como manipulador deste arquivo

(Embora em ambos os casos funcione bem se você usa soffice My-Spreadsheet )

Se você renomear o arquivo sem extensão para My-Spreadsheet.ods com mv e tentar abri-lo, verá o seguinte:

(reparo falha)

E você terá que colocar a extensão original de volta para abrir o arquivo corretamente (você pode então converter o formato se quiser)

TL; DR:

Se você tiver arquivos não-nativos com extensões de nome, não remova as extensões, supondo que tudo esteja OK!

    
por Zanna 27.07.2016 / 10:06
18

Eu gostaria de ter uma abordagem diferente para isso de outras respostas, e desafiar a noção de que "Linux" ou "Windows" tem algo a ver com isso (tenha paciência comigo).

O conceito de extensão de arquivo pode ser simplesmente expresso como "uma convenção para identificar o tipo de arquivo baseado em parte de seu nome". As outras convenções comuns para identificar o tipo de um arquivo são comparar seu conteúdo com um banco de dados de assinaturas conhecidas (a abordagem "número mágico") e armazená-lo como um atributo extra no sistema de arquivos (a abordagem usada no MacOS original) .

Como todos os arquivos em um sistema Windows ou Linux possuem um nome e um conteúdo, os processos que desejam conhecer o tipo de arquivo podem usar as abordagens "extension" ou "magic number" conforme acharem melhor. A abordagem de metadados geralmente não está disponível, pois não há lugar padrão para esse atributo na maioria dos sistemas de arquivos.

No Windows, há uma strong tradição de usar a extensão de arquivo como principal meio de identificar um arquivo; mais visivelmente, o navegador de arquivos gráficos (Gerenciador de Arquivos no Windows 3.1 e Explorer no Windows moderno) usa quando você clica duas vezes em um arquivo para determinar qual aplicativo será iniciado. No Linux (e, mais geralmente, sistemas baseados em Unix), há mais tradição para inspecionar o conteúdo; mais notavelmente, o kernel analisa o início de um arquivo executado diretamente para determinar como executá-lo; arquivos de script podem indicar um interpretador para usar iniciando com #! seguido pelo caminho para o interpretador.

Essas tradições influenciam o design da interface do usuário de programas escritos para cada sistema, mas há muitas exceções, porque cada abordagem tem vantagens e desvantagens em diferentes situações. Os motivos para usar as extensões de arquivo em vez de examinar os conteúdos incluem:

  • examinar o conteúdo do arquivo é bastante caro comparado ao examinar nomes de arquivos; por exemplo, "localizar todos os arquivos com o nome * .conf" será muito mais rápido do que "localizar todos os arquivos cuja primeira linha corresponda a essa assinatura"
  • o conteúdo do arquivo pode ser ambíguo; muitos formatos de arquivos são, na verdade, apenas arquivos de texto tratados de uma maneira especial, muitos outros são arquivos zip especialmente estruturados e a definição de assinaturas precisas para esses problemas pode ser difícil
  • um arquivo pode ser genuinamente válido como mais de um tipo; um arquivo HTML também pode ser XML válido, um arquivo zip e um GIF concatenado juntos permanecem válidos para ambos os formatos
  • A correspondência de números mágicos
  • pode levar a falsos positivos; um formato de arquivo que não tem cabeçalho pode começar com os bytes "GIF89a" e ser identificado erroneamente como uma imagem GIF
  • renomear um arquivo pode ser uma maneira conveniente de marcá-lo como "desativado"; por exemplo. mudar "foo.conf" para "foo.conf ~" para indicar um backup é mais fácil do que editar o arquivo para comentar todas as suas diretivas, e mais conveniente do que movê-lo para fora de um diretório carregado automaticamente; Da mesma forma, renomear um arquivo .php para .txt informará ao Apache para servir sua origem como texto simples, em vez de passá-lo para o mecanismo PHP

Exemplos de programas Linux que usam nomes de arquivos por padrão (mas podem ter outros modos):

  • O gzip e o gunzip têm tratamento especial de qualquer arquivo que termine ".gz"
  • O gcc manipula arquivos ".c" como C e ".cc" ou ".C" como C ++
por IMSoP 27.07.2016 / 19:13
13

Na verdade, algumas tecnologias do dependem de extensões de arquivo, portanto, se você usar essas tecnologias no Ubuntu, também precisará depender de extensões. Alguns exemplos:

  • gcc usa extensões para distinguir entre arquivos C e C ++. Sem a extensão é praticamente impossível diferenciá-los (imagine um arquivo C ++ sem classes).
  • muitos arquivos ( docx , jar , apk ) são apenas arquivos ZIP especialmente estruturados. Embora normalmente você possa inferir o tipo a partir do conteúdo, nem sempre isso é possível (por exemplo, o Java Manifest é opcional em arquivos jar ).

Não usar extensões de arquivo nesses casos só será possível com soluções alternativas de hackers e provavelmente será muito propenso a erros.

    
por Dmitry Grigoryev 27.07.2016 / 17:52
6

Sua primeira suposição está correta: as extensões no Linux não importam e são úteis apenas para humanos (e outros sistemas operacionais que não sejam do tipo Unix e que se preocupam com extensões). O tipo de arquivo é determinado pelos primeiros 32 bits de dados no arquivo, conhecido como magic number É por isso que os scripts de shell precisam de #! line - para informar ao sistema operacional qual interpretador chamar. Sem ele, o shell script é apenas um arquivo de texto.

No que diz respeito aos gerenciadores de arquivos, eles querem saber extensões de alguns arquivos, como .desktop files, que basicamente são iguais à versão do Windows de atalhos, mas com mais recursos. Mas no que diz respeito ao sistema operacional, ele precisa saber o que está no arquivo, não o que está em seu nome

    
por Sergiy Kolodyazhnyy 27.07.2016 / 09:02
4

Isso é muito grande para uma resposta de comentário.

Tenha em mente que mesmo a "extensão" tem muitos significados diferentes.

O que você está falando parece ser as 3 letras após o. O DOS tornou o formato 8.3 realmente popular e o Windows usa a parte .3 até hoje.

O Linux tem muitos arquivos como .conf ou .list ou .d ou .c que têm significado, mas não são realmente extensões no sentido 8.3. Por exemplo, o Apache examina o /etc/apache2/sites-enabled/website.conf para sua diretiva de configuração. Enquanto o sistema usa MIME Types e cabeçalhos de conteúdo e o que não é para determinar se é um arquivo de texto, o Apache (por padrão) ainda não o carregará sem terminar em .conf.

.c é outro ótimo. Sim, é um arquivo de texto, mas o gcc depende do main.c se tornando main.o e finalmente main (depois do link). Em nenhum momento o sistema usa o .c, .o ou nenhuma extensão para ter algum significado quanto ao conteúdo, mas o material após o. tem algum significado. Você provavelmente configuraria seu SCM para ignorar main.o e main.

O ponto sendo é o seguinte: as extensões não são usadas da maneira como estão no Windows. O kernel não executará um arquivo .txt porque você remove a parte .txt do nome. Também é muito feliz executar um arquivo .txt se a permissão de execução estiver configurada. Dito isto, eles têm significado e ainda são usados em um "nível de computador" para muitas coisas.

    
por coteyr 27.07.2016 / 11:15