🔍Lendo, buscando e calculando tamanho de arquivos

Já entendemos como buscar por ajuda, procurar binários e navegar no sistema de arquivos. Agora vamos tratar dos arquivos em si: ler, como calcular seu tamanho e como buscá-los.

Leitura de arquivos

Para ler um arquivo de texto, é possível utilizar qualquer um dos comandos descritos abaixo.

cat

  • Uso: cat arquivo

  • Irá mostrar o conteúdo do arquivo na tela, na ordem que as linhas estão em disco.

  • Quando repassado mais de um arquivo na linha de comando, irá concatenar os dois arquivos, mostrando os seus conteúdos na tela.

Uso básico do comando cat

tac

  • Uso: tac arquivo

  • Irá mostrar o conteúdo do arquivo na tela, na ordem contrária que as linhas estão em disco (mostra a primeira linha como última, a segunda como penúltima etc).

  • Quando repassado mais de um arquivo na linha de comando, irá concatenar os dois arquivos, mostrando os seus conteúdos na tela (na ordem reversa de cada um dos arquivos).

Uso básico do comando tac

head/tail

head e tail são utilizados para mostrar as n primeiras linhas de um arquivo ou as n últimas linhas, respectivamente. Segue abaixo a sintaxe:

  • head -n inteiro arquivo

  • tail -n inteiro arquivo

Exemplo do uso dos comandos head e tail

less/more

Os comandos less/more são bem semelhantes e sua principal função é a de realizar paginação de um arquivo - uma navegação no conteúdo semelhante aos manuais que abordamos anteriormente. Isso é útil quando o arquivo lido contém uma quantidade grande de linhas que não podem ser exibidos totalmente na tela.

O uso padrão é more arquivo ou less arquivo.

Saída do comando less

Calculando tamanho dos arquivos - wc, du

Já vimos que o ls -l retorna o tamanho de um arquivo, mas também outras informações que podem não ser úteis em todas as situações. Para realizar a ação de calcular o tamanho de um arquivo, temos duas opções, descritas abaixo.

Informações de tamanho de arquivos de texto - wc

Para arquivos de texto, temos o wc, que funciona de formas diferentes de acordo com as opções repassadas. Alguns exemplos são:

  • Contar a quantidade de linhas: wc -l arquivo

  • Contar a quantidade de palavras: wc -w arquivo

  • Contar a quantidade de caracteres: wc -c arquivo

  • Contar a quantidade de linhas, palavras e caracteres (nessa ordem): wc arquivo

Casos de uso do comando wc

Arquivos de texto são arquivos que contém apenas caracteres printáveis

Note que, embora o comando seja direcionado para arquivos de texto, utilizar a opção -c funcionará corretamente com qualquer tipo de arquivo. Isso ocorre pois o tamanho de um caractere é exatamente um byte, então o wc retornará corretamente o tamanho do arquivo.

Informações de tamanho de arquivos gerais e diretórios - du

Para arquivos que não são textos (e também diretórios), é possível utilizar o comando du, que mostra o tamanho de arqiuvos em disco. Há duas opções úteis para ele:

  • Calculando o tamanho de arquivos e diretórios em bytes: du -b arquivooudiretorio

  • Calculando o tamanho de arquivos e diretórios em unidades legíveis por humanos (kB, MB, GB...): du --aparent-size -h arquivooudiretorio. A opção --aparent-size é necessária para mostrar a quantidade de bytes legíveis do arquivo em questão. Sem ela, o du irá calcular com base no uso de disco, que é medido por blocos e não bytes em si.

Buscando arquivos com uso de filtros - find

Um dos comandos mais completos para buscar arquivos no Linux é o find. Simplificando sua sintaxe, seu uso é o seguinte:

find /path/para/comecar/a/pesquisa opcoes

Ele permite uma vasta gama de filtros, mas para simplicidade, abordaremos apenas um pequeno subconjunto deles. São eles:

-type

Especifica o tipo do arquivo:

  • d - diretório

  • f - arquivo regular

  • l - link simbólico ("atalho")

  • b - dispositivo de bloco (como um HD em /dev/sda)

  • c - dispositivo de caractere (como um console virtual em /dev/ttyS0, ou um dispositivo de teclado)

É possível procurar por mais de um tipo de arquivo separando os tipos por vírgula, como em find / -type f,b, que procurará a partir de / arquivos regulares e de bloco.

-name

Especifica uma substring case-sensitive que está contida no nome do arquivo, podendo ser o próprio nome do arquivo em si. Caracteres curinga, como o asterisco (*) podem ser utilizados para dar match com um arquivo que não se sabe o nome exato.

Exemplos de uso do filtro -name

-iname

Especifica uma substring case-insensitive que está contida no nome do arquivo, podendo ser o próprio nome do arquivo em si. Caracteres curinga, como o asterisco (*) podem ser utilizados para dar match com um arquivo que não se sabe o nome exato.

Exemplos de uso do filtro -iname

-exec

Para cada linha de resultado, irá concatenar um comando que deverá ser executado para cada entrada. Vamos analisar, por exemplo, o uso do comando file, que traz informações sobre o formato do arquivo (se é uma imagem, um documento, um executável) em conjunto com o find:

Exemplo de execução do comando find com opção -exec

Note que o -exec recebe como parâmetros, nesse caso, três coisas: find, {} e \;

  • file é o comando que queremos executar para cada linha que o find retornar. Verifique o comando find tofind/ na imagem: é para cada um desses arquivos. Logo, digitamos -exec file

  • {} é um marcador para o -exec de onde deve colocar a linha retornada pelo find (ou seja, é um placeholder que será substituído pela saída). Nesse caso, o comando file funciona da seguinte forma: file arquivo, logo, queremos que a saída do find seja imediatamente após o file, então digitamos -exec file {}

  • O \; indica qual separador o find irá utilizar para concatenar os comandos de execução. No Linux, você pode executar um comando após o outro na mesma linha finalizando o primeiro com ;. Por exemplo ls; cat /home/user/arquivo.txt irá executar primeiro o ls e logo em seguida o cat. No caso do find, ele internamente irá executar todos os comandos do -exec concatenados, como file primeiralinha; file segundalinha; file terceiralinha, e utilizamos o \; para definir esse delimitador de final de comando - a barra inversa serve apenas para escapar da shell atual e não ser lida como o final do comando find. Outro uso possível é o caractere +, que tem um significado especial no find. Para essa opção o leitor pode pesquisar e encontrar o significado com man find 😄

Casos de uso:

  • Listar toda a subárvore de diretórios e arquivos do diretório corrente: find .

  • Listar apenas subdiretórios a partir do diretório atual: find . -type d

  • Listar todos os arquivos que têm nome terminando por sql: find / -name "*.sql"

Buscando arquivos de forma mais simples - locate, updatedb

O comando locate também pode ser utilizado para pesquisar por arquivos, usando a sintaxe: locate nomedoarquivo

Para executar esses comandos, é necessário instalar o pacote mlocate com o comando: sudo apt install mlocate -y

Entretanto, o funcionamento do locate necessita de um banco de dados interno, que grava a localização de todos os arquivos do sistema. Caso um arquivo tenha sido criado recentemente, é necessário atualizar a base de dados com o comando updatedb, para que o locate tenha sucesso na busca.

Funcionamento do updatedb

Last updated