Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Dica publicada em Linux / Jogos
Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Olá!Muitos de nós que gostamos de emulação temos o mesmo "problema": uma pasta com nossas ROMs favoritas, cuidadosamente traduzidas para o português, e outra pasta com uma coleção maior, com as versões originais (americanas, japonesas, etc.).
O desafio é: como podemos copiar os jogos que faltam da coleção original para a nossa coleção traduzida, sem substituir as traduções que já temos e sem criar duplicatas?
Por exemplo, queremos que o script ignore o
Contra (USA).zip da pasta de originais se já tivermos um Contra.zip na nossa pasta de traduções.
Um simples cp não resolve, pois os nomes dos arquivos são diferentes. A solução é usar um script em Bash que "pensa" antes de copiar.
A Lógica da Solução
A ideia é criar um script que, para cada jogo na pasta de ROMs originais, siga estes passos:1. Normaliza o Nome: Ele pega o nome do arquivo, como
Double Dragon (USA).zip, e remove todas as informações extras (como (USA), (Japan), (Rev 1)) e a extensão .zip, resultando em um nome "limpo", como Double Dragon.
2. Verifica a Existência: O script então procura na sua pasta de ROMs traduzidas se já existe algum arquivo que comece com esse nome limpo.
3. Toma a Decisão:
- Se o jogo já existe na sua coleção, ele é ignorado, preservando sua versão traduzida.
- Se o jogo não existe, ele é considerado um novo título para a sua coleção.
Criando o Script Interativo
Para tornar o processo seguro, nosso script primeiro fará uma análise completa, listará todos os arquivos que seriam copiados e, no final, pedirá sua confirmação antes de mover um único arquivo.Vamos ao passo a passo:
1. Abra o terminal (
Ctrl + Alt + T).
2. Crie o arquivo que conterá nosso script com o seu editor de texto preferido. Vamos usar o
nano:
nano merge_roms.sh
3. Agora, cole o código do script que será apresentado no final deste dica dentro do editor
nano.
4. Dentro do script, você precisará alterar as duas primeiras linhas para indicar os caminhos corretos das suas pastas de ROMs:
PASTA1="/caminho/para/sua/pasta_traduzida"
PASTA2="/caminho/para/sua/pasta_originais"
5. Após colar e editar os caminhos, salve o arquivo e saia do
nano pressionando Ctrl + X, depois Y e, por fim, Enter.
6. Agora, dê a permissão de execução para o seu novo script:
chmod +x merge_roms.sh
7. Tudo pronto! Execute o script com:
./merge_roms.sh
O script irá analisar tudo e, ao final, perguntará se você deseja prosseguir. Se tudo estiver correto, digite
prossiga e tecle Enter para ver sua coleção de ROMs ficar ainda mais completa!
Espero que esta dica seja útil.
Segue o script:
#!/bin/bash
# --- CONFIGURAÇÃO ---
# !!! IMPORTANTE: Altere os caminhos abaixo para os caminhos corretos das suas pastas !!!
PASTA1="/media/xerxes/MMPLUS/Roms/FC" # Pasta de destino (suas ROMs traduzidas)
PASTA2="/home/xerxes/Downloads/tiny-best-set-go-games/Roms/FC" # Pasta de origem (ROMs não traduzidas)
# --------------------
# Verifica se os diretórios existem
if [ ! -d "$PASTA1" ] || [ ! -d "$PASTA2" ]; then
echo "❌ Erro: Um ou ambos os diretórios não foram encontrados. Verifique os caminhos no script."
exit 1
fi
echo "Pasta de ROMs Traduzidas (Destino): $PASTA1"
echo "Pasta de ROMs Originais (Origem): $PASTA2"
echo "-----------------------------------------------------"
echo "🔎 Fase 1: Analisando quais jogos da Pasta 2 podem ser copiados..."
echo "-----------------------------------------------------"
# Array para armazenar a lista de jogos a serem copiados
JOGOS_A_COPIAR=()
# Loop através de cada arquivo .zip na Pasta 2
for JOGO_ORIGEM in "$PASTA2"/*.zip; do
# Pega apenas o nome do arquivo, sem o caminho
NOME_ARQUIVO_ORIGEM=$(basename "$JOGO_ORIGEM")
# Normaliza o nome: remove tudo a partir do primeiro parêntese ou colchete
# e também remove a extensão .zip
NOME_NORMALIZADO=$(echo "$NOME_ARQUIVO_ORIGEM" | sed -E 's/ \(.+\)//g; s/ \[.+\]//g; s/\.zip$//')
# Verifica se um arquivo com o nome normalizado já existe na Pasta 1
EXISTE_NA_PASTA1=$(find "$PASTA1" -maxdepth 1 -type f -name "$NOME_NORMALIZADO*.zip" | head -n 1)
if [ -z "$EXISTE_NA_PASTA1" ]; then
# Se a variável estiver vazia, o jogo não existe na Pasta 1
echo " [+] Adicionar à lista de cópia: '$NOME_ARQUIVO_ORIGEM'"
JOGOS_A_COPIAR+=("$JOGO_ORIGEM")
else
# O jogo já existe, então não fazemos nada
:
fi
done
echo "-----------------------------------------------------"
echo "✨ Análise concluída!"
echo ""
# Verifica se há jogos para copiar
if [ ${#JOGOS_A_COPIAR[@]} -eq 0 ]; then
echo "Nenhum jogo novo para copiar. Sua coleção já está completa!"
exit 0
fi
echo "Serão copiados ${#JOGOS_A_COPIAR[@]} novos jogos para a sua coleção."
echo ""
read -p "Deseja prosseguir com a cópia? (digite 'prossiga' e pressione Enter): " CONFIRMACAO
# Verifica a confirmação do usuário
if [ "$CONFIRMACAO" == "prossiga" ]; then
echo ""
echo "🚀 Iniciando a cópia..."
for JOGO_PARA_COPIAR in "${JOGOS_A_COPIAR[@]}"; do
cp -v "$JOGO_PARA_COPIAR" "$PASTA1/"
done
echo ""
echo "✅ Cópia concluída com sucesso!"
else
echo ""
echo "❌ Operação cancelada pelo usuário. Nenhum arquivo foi copiado."
fi
_________________________________________________________
Rule number one: Always listen 'to' Buck!
Enquanto o cursor estiver pulsando, há vida!