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:
- Um sistema Linux ou macOS: Este guia é direcionado para sistemas Unix-like.
- Um terminal: Sua interface de linha de comando.
- Conhecimento básico de Bash: Familiaridade com comandos básicos, variáveis e condicionais.
- 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.
ls
edircolors
: 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
oupacman -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.
- Arch Linux (e derivados):
- Opção 2: Download e instalação manual:
- Acesse o site oficial das Nerd Fonts.
- Escolha uma fonte que te agrade e baixe o arquivo
.zip
. Recomendo a “Hack Nerd Font” ou a “Fira Code Nerd Font”. - Extraia o arquivo
.zip
. - 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. - 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
eelif
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 pelodircolors
e resetando a cor para o padrão.
- Detecção do tipo de arquivo: Usa condicionais
- Chamada do
ls
: Executa o comandols -l
(listagem detalhada) para obter a lista de arquivos, remove a primeira linha (o total de blocos) comtail -n +2
e extrai o nome do arquivo comawk '{print $9}'
. A saída é então passada para a funçãoadd_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.
- Tornar o script executável:
chmod +x ~/.ls-icons
- Criar um alias: Adicione a seguinte linha ao seu arquivo
~/.bashrc
(ou~/.zshrc
se você usa Zsh):alias ls="bash ~/.ls-icons"
- 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.
- 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. - 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.
- Ativar o
dircolors
: Adicione as seguintes linhas ao seu arquivo~/.bashrc
(ou~/.zshrc
):if [ -f ~/.dircolors ]; then eval "$(dircolors -b ~/.dircolors)" fi
- 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
) ela
(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 comandogit 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.
“`