# Semana 8: Criação e edição de arquivos > Importante! Este material foi elaborado para ser lido em terminais e > acompanhado (e praticado) em dispositivos de desktop! ## Perguntas-chave - O que é um arquivo? - Como ler o conteúdo de um arquivo? - Como criar um novo arquivo? - Como alterar o conteúdo de arquivos? ## O que é um arquivo - Conjunto de dados que forma uma unidade. - Gravados em dispositivos de armazenamento persistente. - Identificados por nomes. ### Tipos de arquivos em sistemas UNIX-like - Diretório - Arquivo comum - Link - Pipe - Socket - Dispositivo bloco - Dispositivo caractere ## Como o conteúdo dos arquivos é acessado Os arquivos são acessados quando um processo requisita ao sistema uma via para escrita ou leitura de seu conteúdo. Em programação, é comum chamarmos essas vias de *file handlers*, mas, nos sistemas UNIX/Linux, elas são chamadas de ***descritores de arquivos***. ### O que são descritores de arquivos - No UNIX (e no Linux) tudo é arquivo. - O hardware é abstraído pelo kernel como arquivos de dispositivos. - Os fluxos de dados trafegam por descritores de arquivos (fd). - Descritores de arquivos são ligações simbólicas (links) com dispositivos de terminal e outros tipos de arquivos. ### Fluxos de dados padrão `STDIN`, `STDOUT` e `STDERR` são os fluxos de dados padrão, ou seja, todo processo é iniciado com acesso a esses três dispositivos. Na prática, eles são ligações simbólicas para os descritores de arquivos atribuídos ao processo. ``` $ ls -l /dev/std* lrwxrwxrwx 1 root root 15 mar 31 01:54 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 mar 31 01:54 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 mar 31 01:54 /dev/stdout -> /proc/self/fd/1 ``` Por sua vez, os descritores de arquivos são ligações simbólicas com um dispositivo de terminal. ``` $ ls -l /proc/self/fd lr-x------ 1 blau blau 64 abr 5 10:40 3 -> /proc/738490/fd lrwx------ 1 blau blau 64 abr 5 10:40 0 -> /dev/pts/0 lrwx------ 1 blau blau 64 abr 5 10:40 1 -> /dev/pts/0 lrwx------ 1 blau blau 64 abr 5 10:40 2 -> /dev/pts/0 ``` ### Redirecionamentos e pipes Originalmente, os fluxos de dados padrão originam-se no teclado do terminal ou destinam-se ao display do terminal. Quando queremos mudar este comportamento, nós recorremos aos mecanismos dos pipes e redirecionamentos: - **Redirecionamento:** fluxo de dados entre processos e arquivos. - **Pipe:** fluxo de dados entre dois processos. > Embora o efeito final seja o fluxo entre processos, o mecanismo > do pipe é implementado na forma de dois redirecionamentos com o > mesmo arquivo de pipe. ``` +------------+ FD1 +------+ FD0 +------------+ | PROCESSO 1 |------->| PIPE |------->| PROCESSO 2 | +------------+ W +------+ R +------------+ ``` ## Como criar um novo arquivo - Com editores de texto (`vi`, `vim`, `nano`, etc). - Pelo efeito do uso de alguns utilitários (`touch`, por exemplo). - Com redirecionamentos de escrita (`>`) ou de *append* (`>>`). > **Nota:** outilitário `touch` é tradicionalmente associado à > criação de novos arquivos, mas isso é apenas um efeito colateral > opcional da sua principal finalidade, que é alterar a data e a > hora do último acesso a um arquivo. ### Redirecionamento de escrita - A saída de dados é escrita em um arquivo. - Se o arquivo não existir, ele será criado. - Se existir, seu conteúdo será truncado antes do início da escrita. > **Nota:** como podemos ver, os redirecionamentos de escrita também > funcionam para a escrita de dados em arquivos, mesmo que eles já > existam. ### Redirecionamento de 'append' - A saída de dados é escrita em um arquivo. - Se o arquivo não existir, ele será criado. - Se existir, novas linhas serão incluídas no final do conteúdo original. ### Outra forma de alterar o conteúdo de arquivos Utilitário `sed` (stream editor) com a opção `-i` também é capaz de modificar o conteúdo de arquivos. Na implementação GNU, também é possível criar um arquivo de backup passado um sufixo como argumento da opção `-i`: ``` $ echo $'banana\nlaranja' > teste.txt $ cat teste.txt banana laranja $ sed -i 's/banana/abacate/' teste.txt $ cat teste.txt abacate laranja $ sed -i.bkp 's/abacate/pitanga/' teste.txt $ cat teste.txt pitanga laranja $ cat teste.txt.bkp abacate laranja ``` ## Como ler o conteúdo de arquivos O usuário pode ler (visualizar) o conteúdo de arquivos... - Imprimindo no terminal com utilitários apropriados. - Abrindo com paginadores (`more`, `less`, `most`, etc). - Abrindo com editores de texto. Mas, se estivermos falando sobre como os processos podem ler o conteúdo de arquivos, a resposta será: com redirecionamento de leitura (`<`).