Carlos Miranda

Organizador de arquivos com um Bash Script

março 10, 2025

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:

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

https://mlopswithhamza.medium.com/simple-project-organize-your-chaotic-files-with-a-shell-script-08d7829fbd6c