Monday

18-08-2025 Vol 19

Criei um Comando ls que Exibe Ícones com Cores

Criei um Comando ls que Exibe Ícones com Cores: Um Guia Passo a Passo

O comando ls é uma ferramenta fundamental para qualquer usuário de Linux. No entanto, sua saída padrão pode ser um tanto… monótona. Imagine poder visualizar seus arquivos e diretórios com ícones coloridos que representam o tipo de arquivo? Neste artigo, vou guiá-lo através do processo de criação de um comando ls personalizado que faz exatamente isso, transformando a sua experiência com o terminal em algo mais visualmente agradável e informativo.

Por que Personalizar o Comando ls?

Antes de entrarmos no código, vamos entender os benefícios de ter um ls personalizado:

  • Identificação Rápida: Ícones e cores facilitam a identificação do tipo de arquivo (diretório, arquivo executável, imagem, etc.) à primeira vista.
  • Melhora a Produtividade: Ao identificar rapidamente os arquivos que você procura, você economiza tempo e aumenta a eficiência.
  • Customização: Permite adaptar a visualização ao seu gosto pessoal e às suas necessidades específicas.
  • Aprendizado: O processo de criação é uma ótima maneira de aprender sobre scripts bash, aliases e variáveis de ambiente.

Ferramentas e Conceitos Necessários

Para seguir este tutorial, você precisará de:

  1. Um sistema Linux ou macOS: Este guia é direcionado para sistemas Unix-like.
  2. Um terminal: Sua interface de linha de comando.
  3. Conhecimento básico de Bash: Familiaridade com comandos básicos, variáveis e condicionais.
  4. Fontes Nerds (Nerd Fonts): Uma coleção de fontes que incluem glifos (ícones) que usaremos para representar os arquivos. Recomendo a instalação de uma Nerd Font.
  5. ls e dircolors: Os comandos base que iremos personalizar.

Passo 1: Instalando as Fontes Nerds (Nerd Fonts)

As Fontes Nerds são cruciais porque contêm os ícones que usaremos para decorar a saída do ls. A instalação varia dependendo do seu sistema. Aqui estão algumas opções:

  • Opção 1: Usando um gerenciador de pacotes (recomendado):
    • Arch Linux (e derivados): yay -S nerd-fonts-complete ou pacman -S nerd-fonts-complete
    • Debian/Ubuntu: Você pode baixar as fontes diretamente do site oficial e instalá-las manualmente.
    • Fedora/CentOS/RHEL: Similar ao Debian/Ubuntu, baixe e instale manualmente.
  • Opção 2: Download e instalação manual:
    1. Acesse o site oficial das Nerd Fonts.
    2. Escolha uma fonte que te agrade e baixe o arquivo .zip. Recomendo a “Hack Nerd Font” ou a “Fira Code Nerd Font”.
    3. Extraia o arquivo .zip.
    4. Instale as fontes. No Linux, geralmente você precisa copiar os arquivos .ttf para ~/.fonts. No macOS, basta abrir os arquivos .ttf e seguir as instruções.
    5. Atualize o cache de fontes: fc-cache -f -v

Após a instalação, certifique-se de que o seu terminal está configurado para usar a Nerd Font que você instalou. As configurações para isso variam dependendo do seu terminal.

Passo 2: Criando o Script ls Customizado

Agora, vamos criar o script que irá gerar a saída do ls com ícones e cores. Este script usará o comando ls padrão e o comando dircolors para aplicar cores, e adicionará os ícones usando condicionais e variáveis.

Crie um novo arquivo chamado .ls-icons na sua pasta home:

nano ~/.ls-icons

Cole o seguinte script dentro do arquivo:

#!/bin/bash

# Definir ícones para tipos de arquivos
file_icon=" "       # Ícone padrão para arquivos
dir_icon=" "        # Ícone para diretórios
link_icon=" "       # Ícone para links simbólicos
exec_icon=" "       # Ícone para arquivos executáveis
image_icon=" "      # Ícone para arquivos de imagem
video_icon=" "      # Ícone para arquivos de vídeo
audio_icon=" "      # Ícone para arquivos de áudio
archive_icon=" "    # Ícone para arquivos de arquivamento (zip, tar, etc.)
git_icon=" "       # Ícone para repositórios Git
pdf_icon=" "       # Ícone para arquivos PDF
config_icon=" "    # Ícone para arquivos de configuração
doc_icon=" "        # Ícone para arquivos de documento
code_icon=" "      # Ícone para arquivos de código

# Função para adicionar ícones e cores
add_icons() {
  while IFS= read -r file; do
    # Detectar cor do dircolors
    color=$(dircolors --print | grep "$(echo "$file" | sed 's/\x1b\[[0-9;]*m//g')$" | sed 's/^.*=//' | tr -d ':')

    # Resetar cor para o padrão
    reset_color=$'\e[0m'

    # Remover caracteres de cor ANSI da string do arquivo para correspondência precisa
    file_no_color=$(echo "$file" | sed 's/\x1b\[[0-9;]*m//g')

    icon=""

    if [[ -d "$file_no_color" ]]; then
      icon="$dir_icon"
    elif [[ -l "$file_no_color" ]]; then
      icon="$link_icon"
    elif [[ -x "$file_no_color" ]]; then
      icon="$exec_icon"
    elif [[ "$file_no_color" == *.png || "$file_no_color" == *.jpg || "$file_no_color" == *.jpeg || "$file_no_color" == *.gif || "$file_no_color" == *.svg ]]; then
      icon="$image_icon"
    elif [[ "$file_no_color" == *.mp4 || "$file_no_color" == *.avi || "$file_no_color" == *.mov ]]; then
      icon="$video_icon"
    elif [[ "$file_no_color" == *.mp3 || "$file_no_color" == *.wav || "$file_no_color" == *.ogg ]]; then
      icon="$audio_icon"
    elif [[ "$file_no_color" == *.zip || "$file_no_color" == *.tar || "$file_no_color" == *.gz || "$file_no_color" == *.rar ]]; then
      icon="$archive_icon"
    elif [[ -d "$file_no_color/.git" ]]; then
      icon="$git_icon"
    elif [[ "$file_no_color" == *.pdf ]]; then
      icon="$pdf_icon"
    elif [[ "$file_no_color" == *.conf || "$file_no_color" == *.ini || "$file_no_color" == *.yaml || "$file_no_color" == *.toml ]]; then
      icon="$config_icon"
    elif [[ "$file_no_color" == *.doc || "$file_no_color" == *.docx || "$file_no_color" == *.odt ]]; then
      icon="$doc_icon"
    elif [[ "$file_no_color" == *.js || "$file_no_color" == *.py || "$file_no_color" == *.java || "$file_no_color" == *.c || "$file_no_color" == *.cpp || "$file_no_color" == *.sh ]]; then
      icon="$code_icon"
    else
      icon="$file_icon"
    fi

    # Imprimir com cor, ícone e nome do arquivo
    if [ -n "$color" ]; then
      printf "%b%s%s%b\n" "$color" "$icon" "$file_no_color" "$reset_color"
    else
      printf "%s%s\n" "$icon" "$file_no_color"
    fi
  done
}

# Usar ls -l por padrão para obter mais informações
ls -l "$@" | tail -n +2 | awk '{print $9}' | add_icons

Explicação do Código:

  • Definição de Ícones: A seção inicial define variáveis para cada tipo de arquivo, atribuindo-lhes um ícone da Nerd Font. Você pode personalizar esses ícones conforme sua preferência.
  • Função add_icons: Esta função recebe uma lista de arquivos e aplica os ícones e cores apropriados.
    • Detecção do tipo de arquivo: Usa condicionais if e elif para determinar o tipo de arquivo (diretório, link, executável, etc.) baseado em testes como -d (diretório), -l (link), -x (executável) e extensões de arquivo.
    • Atribuição de ícone: Define a variável icon com o ícone correspondente ao tipo de arquivo.
    • Impressão com cor e ícone: Usa o comando printf para imprimir o ícone e o nome do arquivo, aplicando a cor detectada pelo dircolors e resetando a cor para o padrão.
  • Chamada do ls: Executa o comando ls -l (listagem detalhada) para obter a lista de arquivos, remove a primeira linha (o total de blocos) com tail -n +2 e extrai o nome do arquivo com awk '{print $9}'. A saída é então passada para a função add_icons.

Personalizando os Ícones:

Você pode personalizar os ícones substituindo os caracteres dentro das variáveis file_icon, dir_icon, etc. Abra o arquivo ~/.ls-icons com um editor de texto e modifique os valores conforme desejar. Certifique-se de usar caracteres de uma Nerd Font que estejam disponíveis em seu terminal.

Passo 3: Tornando o Script Executável e Criando um Alias

Para que o script funcione, precisamos torná-lo executável e criar um alias para que ele possa ser chamado facilmente a partir do terminal.

  1. Tornar o script executável:
    chmod +x ~/.ls-icons
  2. Criar um alias: Adicione a seguinte linha ao seu arquivo ~/.bashrc (ou ~/.zshrc se você usa Zsh):
    alias ls="bash ~/.ls-icons"
  3. Recarregar a configuração do shell:
    source ~/.bashrc

    Ou, se você usa Zsh:

    source ~/.zshrc

Agora, ao digitar ls no terminal, você deverá ver a saída com os ícones e cores!

Passo 4: Configurando as Cores com dircolors

O comando dircolors é responsável por definir as cores dos arquivos e diretórios. Você pode personalizar as cores para que elas se adequem ao seu tema de terminal e preferências.

  1. Criar o arquivo de configuração .dircolors:
    dircolors -p > ~/.dircolors

    Isso cria um arquivo .dircolors na sua pasta home com as configurações padrão.

  2. Editar o arquivo .dircolors:
    nano ~/.dircolors

    Neste arquivo, você pode modificar as cores para diferentes tipos de arquivos. As cores são definidas usando códigos ANSI. Por exemplo:

    DIR 01;34      # Cor para diretórios (azul)
          LINK 01;36     # Cor para links simbólicos (ciano)
          *.txt 00;37     # Cor para arquivos .txt (branco)

    Você pode encontrar uma lista completa de códigos ANSI de cores na internet.

  3. Ativar o dircolors: Adicione as seguintes linhas ao seu arquivo ~/.bashrc (ou ~/.zshrc):
    if [ -f ~/.dircolors ]; then
            eval "$(dircolors -b ~/.dircolors)"
          fi
  4. Recarregar a configuração do shell:
    source ~/.bashrc

    Ou, se você usa Zsh:

    source ~/.zshrc

Agora, as cores definidas no seu arquivo .dircolors serão aplicadas à saída do ls.

Passo 5: Melhorando o Script (Opcional)

Aqui estão algumas melhorias opcionais que você pode adicionar ao seu script:

  • Suporte a mais tipos de arquivos: Adicione condicionais para detectar e exibir ícones para outros tipos de arquivos, como arquivos de áudio, vídeo, etc.
  • Opções de linha de comando: Adicione opções para personalizar o comportamento do script, como a capacidade de desativar os ícones ou as cores.
  • Integração com outros comandos: Crie aliases para outros comandos, como ll (ls -l) e la (ls -la), para que eles também exibam os ícones e cores.
  • Tratamento de erros: Adicione tratamento de erros para lidar com situações inesperadas, como quando um arquivo não existe ou quando o dircolors não está instalado.
  • Detecção automática de repositórios Git: Em vez de depender apenas da presença de um diretório .git, você pode usar o comando git rev-parse --is-inside-work-tree para verificar se um diretório é um repositório Git.

Exemplo de Melhoria: Adicionando Cores Específicas para Repositórios Git

Podemos adicionar cores específicas para repositórios Git, tornando-os ainda mais fáceis de identificar.

Primeiro, defina uma cor para repositórios Git no seu arquivo ~/.dircolors. Adicione a seguinte linha (ou modifique uma existente):

*.git 01;32      # Verde para repositórios Git

Em seguida, modifique a função add_icons no seu script ~/.ls-icons para usar essa cor:

# ... (trecho anterior do script) ...

    if [[ -d "$file_no_color/.git" ]]; then
      icon="$git_icon"
      color=$'\e[1;32m'  # Cor verde (substitua pela cor desejada)
    elif [[ "$file_no_color" == *.pdf ]]; then
      icon="$pdf_icon"

# ... (trecho posterior do script) ...

Lembre-se de recarregar a configuração do shell (source ~/.bashrc ou source ~/.zshrc) para que as alterações entrem em vigor.

Código Final do Script com as Melhorias Sugeridas

Aqui está o script completo com algumas das melhorias sugeridas:

#!/bin/bash

# Definir ícones para tipos de arquivos
file_icon=" "       # Ícone padrão para arquivos
dir_icon=" "        # Ícone para diretórios
link_icon=" "       # Ícone para links simbólicos
exec_icon=" "       # Ícone para arquivos executáveis
image_icon=" "      # Ícone para arquivos de imagem
video_icon=" "      # Ícone para arquivos de vídeo
audio_icon=" "      # Ícone para arquivos de áudio
archive_icon=" "    # Ícone para arquivos de arquivamento (zip, tar, etc.)
git_icon=" "       # Ícone para repositórios Git
pdf_icon=" "       # Ícone para arquivos PDF
config_icon=" "    # Ícone para arquivos de configuração
doc_icon=" "        # Ícone para arquivos de documento
code_icon=" "      # Ícone para arquivos de código

# Função para adicionar ícones e cores
add_icons() {
  while IFS= read -r file; do
    # Detectar cor do dircolors
    color=$(dircolors --print | grep "$(echo "$file" | sed 's/\x1b\[[0-9;]*m//g')$" | sed 's/^.*=//' | tr -d ':')

    # Resetar cor para o padrão
    reset_color=$'\e[0m'

    # Remover caracteres de cor ANSI da string do arquivo para correspondência precisa
    file_no_color=$(echo "$file" | sed 's/\x1b\[[0-9;]*m//g')

    icon=""

    if [[ -d "$file_no_color" ]]; then
      icon="$dir_icon"
    elif [[ -l "$file_no_color" ]]; then
      icon="$link_icon"
    elif [[ -x "$file_no_color" ]]; then
      icon="$exec_icon"
    elif [[ "$file_no_color" == *.png || "$file_no_color" == *.jpg || "$file_no_color" == *.jpeg || "$file_no_color" == *.gif || "$file_no_color" == *.svg ]]; then
      icon="$image_icon"
    elif [[ "$file_no_color" == *.mp4 || "$file_no_color" == *.avi || "$file_no_color" == *.mov ]]; then
      icon="$video_icon"
    elif [[ "$file_no_color" == *.mp3 || "$file_no_color" == *.wav || "$file_no_color" == *.ogg ]]; then
      icon="$audio_icon"
    elif [[ "$file_no_color" == *.zip || "$file_no_color" == *.tar || "$file_no_color" == *.gz || "$file_no_color" == *.rar ]]; then
      icon="$archive_icon"
    elif [[ -d "$file_no_color/.git" ]]; then
      icon="$git_icon"
      color=$'\e[1;32m' # Verde para Git (opcional)
    elif [[ "$file_no_color" == *.pdf ]]; then
      icon="$pdf_icon"
    elif [[ "$file_no_color" == *.conf || "$file_no_color" == *.ini || "$file_no_color" == *.yaml || "$file_no_color" == *.toml ]]; then
      icon="$config_icon"
    elif [[ "$file_no_color" == *.doc || "$file_no_color" == *.docx || "$file_no_color" == *.odt ]]; then
      icon="$doc_icon"
    elif [[ "$file_no_color" == *.js || "$file_no_color" == *.py || "$file_no_color" == *.java || "$file_no_color" == *.c || "$file_no_color" == *.cpp || "$file_no_color" == *.sh ]]; then
      icon="$code_icon"
    else
      icon="$file_icon"
    fi

    # Imprimir com cor, ícone e nome do arquivo
    if [ -n "$color" ]; then
      printf "%b%s%s%b\n" "$color" "$icon" "$file_no_color" "$reset_color"
    else
      printf "%s%s\n" "$icon" "$file_no_color"
    fi
  done
}

# Usar ls -l por padrão para obter mais informações
ls -l "$@" | tail -n +2 | awk '{print $9}' | add_icons

Considerações Finais

Este guia oferece um ponto de partida sólido para personalizar o comando ls. Sinta-se à vontade para experimentar, adaptar o script às suas necessidades e explorar as inúmeras possibilidades de customização. Com um pouco de criatividade, você pode transformar o seu terminal em uma ferramenta muito mais poderosa e agradável de usar.

Recursos Adicionais

  • Nerd Fonts: https://www.nerdfonts.com/
  • Códigos de cores ANSI: Pesquise no Google por “códigos de cores ANSI” para encontrar tabelas e exemplos.
  • Comando dircolors: Consulte a página do manual do comando dircolors (man dircolors) para obter informações detalhadas sobre como configurar as cores.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *