Recentemente comecei a me aprofundar em Terminals e Shells. Para consolidar o que aprendi nos últimos dias decidi criar um organizador de arquivos utilizando um bash script simples. Ele se baseia no sufixo dos arquivos para separá-los em diferentes diretórios. Por exemplo, arquivos como musica.mp3 e video.mp4 são organizados, respectivamente, nas pastas mp3 e mp4.
O que são Terminals e Shells?
Um Terminal é um programa que permite ao usuário digitar comandos textuais e exibe os resultados na tela. O componente responsável por interpretar e executar esses comandos é conhecido como Shell. Por vezes, o Shell é também chamado de REPL (Read-Eval-Print Loop), que significa:
- Read: Lê os comandos digitados.
- Evaluate: Avalia e executa os comandos.
- Print: Exibe a saída dos comandos.
- Loop: Repetidamente aceita novos comandos para execução.
0. Criar o arquivo sh.
Comece criando um arquivo chamado file_organizer.sh (ou algum outro nome, desde que tenha o sufixo .sh). Nesse arquivo, será inserido todo o código necessário para realizar a organização dos arquivos.
Para permitir a execução do script, é necessario adicionar uma permissão de execução ao arquivo com o comando chmod.
chmod +x ./file_organizer.sh
1. Pegar o nome de todos os arquivos no diretório.
Primeiramente, é necessário obter o nome de todos os arquivos no diretório. Para isso, pode-se utilizar um laço de repetição for-loop, passando como parâmetro o caminho do diretório alvo:
for filepath in path/to/directory/*; do
echo filepath
done
No entanto, isso ainda não é suficiente, pois precisamos apenas dos nomes completos dos arquivos. Para isso, utiliza-se o comando basename, que remove o caminho do diretório, extraindo apenas o nome base dos arquivos:
filename=$(basename “$filepath”)
2. Criar os diretórios com base nas extensões.
Para criar os diretórios e separar todos os arquivos é necessário extrair o sufixo de cada arquivo:
extension=”${filename##*.}”
O ‘#’ remove, a partir do início, um prefixo que corresponde ao padrão especificado. Quando usado com um único símbolo, remove a menor string correspondente, enquanto dois símbolos removem a mais longa. Assim, ${filename##*.} extrai o sufixo do $filename, removendo tudo até o último ponto ( . ), incluindo o ponto, e retorna apenas a extensão.
Exemplo:
filename=”pipoca.txt”
extension=”${filename##*.}” # Saída: “txt”
Para criar os diretórios que armazenarão os arquivos, é necessário combinar o caminho do diretório com o valor da variável extension:
mkdir “path/to/directory/$extension”
O comando mkdir cria um diretório, porém, um erro pode ocorrer se você tentar criar um diretório que já existe. Para evitar essa situação, é necessário verificar previamente se o diretório existe. Caso exista, o diretório não é criado:
if [ ! -d “path/to/directory/$extension” ]; then
mkdir “path/to/directory/$extension”
fi
No código, o -d é uma flag que verifica se o diretório especificado no caminho existe, retornando true ou false. ! nega a condição subsequente. Assim, caso o diretório não exista, o comando mkdir é executado para criá-lo.
3. Mover os arquivos.
Para mover cada arquivo para seu respectivo diretório, utilizamos o comando mv
:
mv “$filepath” “path/to/directory/$extension”
No entanto, para garantir que apenas arquivos sejam movidos, é necessário verificar se o caminho especificado corresponde a um arquivo, utilizando a flag -f:
if [ -f “$filepath” ]; then
mv “$filepath” “path/to/directory/$extension”
fi
4. Configurar os caminhos do usuário.
Para permitir que o usuário seja capaz de utilizar o script passando o caminho do diretório dessa forma:
./file_organizer.sh path/to/directory/
É necessário acessar o caminho enviado pelo usuário como argumento. Isso é feito por meio do parâmetro posicional $1, que contém o valor do primeiro argumento passado ao script. Depois esse valor é atribuído a uma variável path, que será usada para processar os arquivos.
O código completo do script fica assim:
#!/bin/bash
path=$1
for filepath in $path/*; do
filename=$(basename “$filepath”)
extension=”${filename##*.}”
if [ ! -d “$path/$extension” ]; then
mkdir “$path/$extension”
fi
if [ -f “$filepath” ]; then
mv “$filepath” “$path/$extension”
fi
done
(Opcional) 5. Configurar o caminho do script.
Se desejar acessar o script de qualquer lugar, é necessário adicionar seu caminho ao arquivo .bashrc. Esse arquivo é executado automaticamente ao iniciar o terminal e define variáveis de ambiente. No final do arquivo, adicione a seguinte linha:
export PATH=$PATH:/path/to/the/directory/scripts/
Com isso, o diretório onde o script está armazenado será adicionado ao PATH. Agora será possível executar o script de qualquer local da máquina apenas utilizando o nome do arquivo.
Referências
https://stackoverflow.com/questions/35666019/how-does-extension-filename-work-in-bash
https://www.boot.dev/lessons/f9d0dadb-59f8-489b-af77-f6693000d569