Lendo, buscando e calculando tamanho de arquivos
Last updated
Last updated
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.
Para ler um arquivo de texto, é possível utilizar qualquer um dos comandos descritos abaixo.
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: 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).
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
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
.
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.
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
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.
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.
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:
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.
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.
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.
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
:
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 {}
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"
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.
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