Arquivos

N√£o h√° d√ļvida de que o leitor j√° se deparou com diversos arquivos, mas ser√° que j√° pensou numa defini√ß√£o para eles? Defino arquivo como uma sequ√™ncia de bytes armazenada numa m√≠dia digital somados a uma entrada, um registro, no sistema de arquivos (filesystem) que o referencie. Por exemplo, vamos no Linux criar um arquivo cujo seu conte√ļdo √© somente a string ASCII "mentebinaria.com.br" (sem aspas):

$ echo -n 'mentebinaria.com.br' > arquivo

Se nosso estudo sobre strings estiver correto, este arquivo deve possuir 19 bytes de tamanho. Chequemos:

$ wc -c arquivo
19 arquivo

O comando wc conta caracteres (opção -m), palavras (-w), linhas (-l) ou bytes (-c) de um arquivo.

E isto, nos sistemas de arquivos modernos, √© tudo que cont√©m um arquivo: seu conte√ļdo. Qualquer outra informa√ß√£o sobre ele, inclusive seu nome fica numa refer√™ncia neste filesystem. A maneira mais r√°pida de checar tudo isso no Linux √© com o comando stat:

$ stat arquivo
File: ‚Äėarquivo‚Äô
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 532417 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2017-09-08 17:21:32.745159845 -0400
Modify: 2017-09-08 17:21:24.097159494 -0400
Change: 2017-09-08 17:21:24.097159494 -0400
Birth: -

A referência é justamente o que o Linux chama de inode, mas este assunto foge ao escopo de nosso livro. Se quiser entender melhor sobre este e outros detalhes de implementação do Linux, recomendo o livro Descobrindo o Linux, do João Eriberto Mota Filho.

A pergunta mais interessante para n√≥s √©, no entanto, em rela√ß√£o ao tipo de arquivo. Criamos eles sem extens√£o e aqui e √© bom lembrar que uma extens√£o de arquivo nada mais √© que parte de seu nome e esta n√£o mant√©m nenhuma rela√ß√£o com seu tipo real. A √ļnica forma de saber um tipo de arquivo √© inferindo-o atrav√©s de seu conte√ļdo. Vamos olhar seu conte√ļdo com um visualizador hexadecimal, o hexdump, invocado por seu atalho mais comum, o hd:

$ hd arquivo
00000000 6d 65 6e 74 65 62 69 6e 61 72 69 61 2e 63 6f 6d |mentebinaria.com|
00000010 2e 62 72 |.br|
00000013

O hd também nos entrega o tamanho do arquivo em hexa, que neste caso é 0x13 ou 19 em decimal. Então, sabendo que todos os bytes deste arquivo estão na faixa numérica da tabela ASCII, podemos dizer então que este é, de fato, um arquivo de texto. :-)

Uma maneira mais rápida de identificar um tipo de arquivo é trabalhando com o comando file, que se utiliza da libmagic, uma biblioteca que tem catalogadas várias sequências de bytes que representam tipos de arquivos diferentes:

$ file arquivo
arquivo: ASCII text, with no line terminators
‚Äč
$ file -i arquivo
arquivo: text/plain; charset=us-ascii

Como o leitor pode notar, a opção -i o file também nos dá o tipo MIME (do inglês Multipurpose Internet Mail Extensions), que é o tipo de arquivo utilizado na Internet para downloads, e-mail, etc.