Personalizando a Listagem de Arquivos no Linux

LinuxBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como criar um comando ls personalizado que exibe os tamanhos dos diretórios em um formato amigável. Este projeto ajudará você a entender como recuperar e formatar informações de arquivos em um ambiente Linux usando scripts Zsh.

👀 Visualização

$ sh newls.sh /home/labex
## Exemplo
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 project

🎯 Tarefas

Neste projeto, você aprenderá:

  • Como criar um script Zsh para exibir informações de arquivos e diretórios
  • Como formatar o tamanho do arquivo para melhor legibilidade
  • Como determinar o formato de data apropriado para os horários de modificação dos arquivos
  • Como exibir as informações do arquivo no mesmo formato que o comando ls -lh

🏆 Conquistas

Após concluir este projeto, você será capaz de:

  • Escrever um script Zsh que pode exibir os tamanhos de arquivos e diretórios em um diretório especificado
  • Formatar as informações de tamanho do arquivo para melhor legibilidade
  • Determinar o formato de data apropriado para os horários de modificação dos arquivos com base no ano atual e no horário da última modificação do arquivo
  • Exibir as informações do arquivo em um formato amigável que corresponda ao comando ls -lh

Criar o Script newls.sh

Nesta etapa, você criará o script newls.sh que exibirá os tamanhos de todos os arquivos e diretórios em um diretório especificado. Siga as etapas abaixo para concluir esta etapa:

  1. Abra um editor de texto e crie um novo arquivo chamado newls.sh no diretório /home/labex/project.
  2. Adicione a seguinte linha shebang no início do arquivo para especificar que este é um script Zsh:
#!/bin/zsh
  1. Adicione um bloco de comentários no início do script para explicar sua finalidade:
## Este script recupera e formata informações de arquivos de um diretório especificado, exibindo-as no mesmo formato que o comando "ls -lh".
  1. Agora, adicione o código para verificar se o parâmetro de entrada (o diretório a ser listado) é fornecido. Caso contrário, exiba uma mensagem de uso e saia do script:
## Verifica se o parâmetro de entrada está vazio
if [ $## -eq 0 ]; then
  echo "Usage: sh newls.sh <directory>"
  exit 1
fi
  1. Em seguida, adicione o código para verificar se o diretório especificado existe. Caso contrário, exiba uma mensagem de erro e saia do script:
## Verifica se o diretório existe
if [ ! -d "$1" ]; then
  echo "Directory $1 does not exist."
  exit 1
fi

Recuperar e Formatar Informações do Arquivo

Nesta etapa, você adicionará o código para recuperar as informações de arquivos e diretórios do diretório especificado e formatar a saída da mesma forma que o comando ls -lh. Siga as etapas abaixo para concluir esta etapa:

  1. Use o comando ls para recuperar as informações detalhadas sobre os arquivos e diretórios no diretório especificado e armazene a saída na variável ls_output:
## Use o comando ls para recuperar informações detalhadas sobre arquivos e diretórios, em seguida, processe a saída linha por linha
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
  1. Adicione um loop while para processar cada linha de ls_output e extrair as informações necessárias:
## Processa cada linha da saída ls
## Remove espaços em branco à direita de cada linha

## Analisa cada campo da linha
  1. Adicione o código para formatar o tamanho do arquivo para melhor legibilidade:
## Formata o tamanho do arquivo para melhor legibilidade
if [[ $size =~ ^[0-9]+$ ]]; then
  ## Se o tamanho for um número, formate-o
  if ((size < 1024)); then
    size_formatted="${size}B"
  elif ((size < 1024 ** 2)); then
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / 1024" | bc))K"
  elif ((size < 1024 ** 3)); then
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**2)" | bc))M"
  else
    size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**3)" | bc))G"
  fi
else
  ## Se o tamanho não puder ser analisado como um número, mantenha-o como está
  size_formatted="$size"
fi
  1. Adicione o código para determinar o formato de data apropriado com base no horário de modificação do arquivo:
current_year=$(date +"%Y")

## Extrai o ano, mês e dia da data modificada
file_year=$(echo "$year" | cut -d' ' -f3)
file_month=$(echo "$month" | cut -d' ' -f1)
file_day=$(echo "$day" | cut -d' ' -f1)

## Converte o zero à esquerda no mês para formato decimal
file_month=$(echo "$file_month" | sed 's/^0//')

## Obtém o timestamp da última modificação do arquivo
file_modified=$(date -d "$month $day $year" +"%s")

## Obtém o timestamp de 6 meses atrás
six_months_ago=$(date -d "6 months ago" +"%s")

## Calcula a diferença em segundos entre o tempo atual e a última modificação do arquivo
time_diff=$(($(date +"%s") - file_modified))

if ((file_year == current_year)); then
  ## Se o ano do arquivo for o mesmo que o ano atual
  if ((time_diff >= six_months_ago)); then
    ## Mais de 6 meses atrás, exibe a data completa: Mês Dia Ano
    formatted_date="$month $day $year"
  else
    ## Nos últimos 6 meses, exibe a data e hora: Mês Dia HH:MM
    formatted_date="$month $day $time"
  fi
else
  ## Se o ano do arquivo for diferente do ano atual, exibe a data completa: Mês Dia Ano
  formatted_date="$month $day $year"
fi
  1. Finalmente, adicione o código para exibir as informações do arquivo formatadas:
## O formato de saída inclui formatação de data personalizada com base na condição

O script newls.sh completo está agora pronto. Você pode salvar o arquivo e passar para a próxima etapa.

Testar o Script newls.sh

Nesta etapa, você testará o script newls.sh para garantir que ele funcione conforme o esperado. Siga as etapas abaixo para concluir esta etapa:

  1. Abra um terminal e navegue até o diretório /home/labex/project.
  2. Execute o script newls.sh com o diretório /home/labex como argumento:
sh newls.sh /home/labex
  1. Verifique se a saída corresponde ao formato esperado, conforme mostrado na descrição do desafio:
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 project
  1. Se a saída corresponder ao formato esperado, seu script newls.sh está funcionando corretamente. Caso contrário, revise o script e faça as correções necessárias.

Parabéns! Você concluiu com sucesso o projeto e criou um comando ls personalizado que exibe os tamanhos dos diretórios em um formato amigável.

Resumo

Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar