bash-mass-diz-zip/mass-diz.sh

265 lines
9.0 KiB
Bash
Raw Normal View History

2025-08-04 09:57:35 +00:00
#!/bin/bash
# =======================================================================
# Variables no inicialitzades (només declarades per a referència)
# =======================================================================
DISCLAIMER="" # Nom del fitxer Disclaimer
DEMO="" # Nom del fitxer Demo
SEPARATOR="" # Caràcter/conjunt de caràcters del separador de camps
FILE_ID="" # Contingut concatenat per a FILE_ID.DIZ
ZIPFILE="" # Nom Base del ZIP Comprimit
ZIPSEQ="" # Número Inicial de Seqüència del ZIP comprimit
FILE_VARS=() # Array per a emmagatzemar els noms de les variables creades dinàmicament
VAR_ORDER=() # Array per a emmagatzemar l'ordre de les variables per a FILE_ID.DIZ
VAR_MAP=() # Array associatiu (emulat) per a mapejar nom_variable=valor
2025-08-04 09:57:35 +00:00
# =======================================================================
# Funcions
# =======================================================================
# Función para solicitar entrada al usuario
ask_user() {
local prompt_msg="$1"
local var_name="$2"
read -r -p "$prompt_msg: " input
eval "$var_name=\"$input\""
}
2025-08-04 09:57:35 +00:00
# Funció per a formatar i abocar el contingut de FILE_ID.DIZ
format_file_id_diz() {
local title_content=""
local other_content=()
local line_content=""
local max_line_len=45
2025-08-04 09:57:35 +00:00
# Omplir line_content amb el contingut formatat
for var_name in "${VAR_ORDER[@]}"; do
# Buscar el valor de la variable
local var_value=""
for map_entry in "${VAR_MAP[@]}"; do
if [[ "$map_entry" == "$var_name="* ]]; then
var_value="${map_entry#*=}"
break
fi
2025-08-04 09:57:35 +00:00
done
if [ -z "$var_value" ]; then
echo "Error intern: Valor per a '$var_name' no trobat." >&2
continue
fi
2025-08-04 09:57:35 +00:00
if [[ "$var_name" == "TITLE" ]]; then
# Condició 1: TITLE es converteix a majúscules
title_content="${var_value^^}"
else
# Condició 2: Altres variables: Nom: Valor
other_content+=("$(printf "%s: %s" "$var_name" "$var_value")")
fi
done
2025-08-04 09:57:35 +00:00
# 1. Abocar TITLE
line_content+="$title_content"$'\n'
# 2. Abocar la resta de variables
for line in "${other_content[@]}"; do
line_content+="$line"$'\n'
done
# 3. Truncar a un màxim de 45 caràcters per línia i abocar a FILE_ID.DIZ
# Es crea/sobrescriu FILE_ID.DIZ
echo -n "" > FILE_ID.DIZ
while IFS= read -r line; do
printf "%s\n" "${line:0:$max_line_len}" >> FILE_ID.DIZ
done <<< "$line_content"
if [ $? -ne 0 ]; then
echo "Error en crear FILE_ID.DIZ." >&2
return 1
fi
return 0
}
# Funció per a incrementar ZIPSEQ
increment_zipseq() {
local current_seq="$1"
local seq_len="${#current_seq}"
# M'asseguro que la seqüència es tracti com un número
local new_num=$((10#$current_seq + 1))
# Formata de nou amb zeros a l'esquerra
printf -v ZIPSEQ "%0${seq_len}d" "$new_num"
return 0
}
# =======================================================================
# Interacció amb l'Usuari per a Configuració Inicial
# =======================================================================
2025-08-04 09:57:35 +00:00
echo "--- Configuració Inicial de l'Script ---"
2025-08-04 09:57:35 +00:00
ask_user "Informa el nom del fitxer Disclaimer" "DISCLAIMER"
ask_user "Informa el nom del fitxer Demo" "DEMO"
ask_user "Informa el caràcter o conjunt de caràcters del separador de camps" "SEPARATOR"
ask_user "Informa el Nome Base del ZIP Comprimit" "ZIPFILE"
ask_user "Informa el Número Inicial de Seqüència del ZIP comprimit (amb zeros a l'esquerra si és necessari)" "ZIPSEQ"
2025-08-04 09:57:35 +00:00
echo "----------------------------------------"
2025-08-04 09:57:35 +00:00
# Verificar si els fitxers Disclaimer i Demo existeixen
if [ ! -f "$DISCLAIMER" ]; then
echo "Compte!: El fitxer Disclaimer ('$DISCLAIMER') no existeix a la ruta."
fi
if [ ! -f "$DEMO" ]; then
echo "Compte!: El fitxer Demo ('$DEMO') no existeix a la ruta."
fi
# =======================================================================
# Processat de Fitxers
# =======================================================================
# Obtenir la llista de fitxers a processar (tots menys . i .., i els definits)
file_list=()
for f in *; do
if [ -f "$f" ] && [ "$f" != "$DISCLAIMER" ] && [ "$f" != "$DEMO" ] && [ "$f" != "FILE_ID.DIZ" ] && [ "$f" != "$0" ]; then
file_list+=("$f")
fi
done
if [ ${#file_list[@]} -eq 0 ]; then
echo "No s'han trobat fitxers per a processar (excloent DISCLAIMER, DEMO, FILE_ID.DIZ i el propi script)."
exit 0
fi
# -----------------------------------------------------------------------
# Pas 1: Processat del Primer Fitxer per a Definir el Patró d'Execució
# -----------------------------------------------------------------------
first_file="${file_list[0]}"
echo "Processant el primer fitxer: $first_file"
# 1. Separar nom i extensió
filename_base="${first_file%.*}"
filename_ext="${first_file##*.}"
# 2. Parsejar el nom base
IFS="$SEPARATOR" read -r -a name_parts <<< "$filename_base"
# Restaurar IFS
IFS=$' \t\n'
# 3. Demanar noms de variables per a cada part del nom base
echo ""
echo "--- Definició del Patró de Variables ---"
FILE_VARS=()
VAR_MAP=()
i=1
for part in "${name_parts[@]}"; do
ask_user "Part $i ('$part'): Informa el nom de la variable per a aquest valor" "var_name_part"
FILE_VARS+=("$var_name_part")
VAR_MAP+=("$var_name_part=$part") # Desar el mapeig per al primer fitxer
i=$((i + 1))
done
2025-08-04 09:57:35 +00:00
# 4. Demanar nom de variable per a l'extensió
ask_user "Extensió ('$filename_ext'): Informa el nom de la variable per a aquest valor" "var_name_ext"
FILE_VARS+=("$var_name_ext")
VAR_MAP+=("$var_name_ext=$filename_ext") # Desar el mapeig
echo "Variables definides: ${FILE_VARS[@]}"
2025-08-04 09:57:35 +00:00
# 5. Sol·licitar ordre de les variables
echo ""
echo "--- Ordenació de Variables per a FILE_ID.DIZ ---"
echo "Variables disponibles (separades per espai): ${FILE_VARS[@]}"
read -r -p "Informa l'ordre desitjat de les variables, separades per espai: " var_order_input
2025-08-04 09:57:35 +00:00
# Validar i emmagatzemar l'ordre
VAR_ORDER=($var_order_input)
if [ ${#VAR_ORDER[@]} -ne ${#FILE_VARS[@]} ]; then
echo "Error: El número de variables a l'ordre no coincideix amb el número de variables definides. Avortant." >&2
exit 1
fi
echo "Ordre establert: ${VAR_ORDER[@]}"
echo "------------------------------------------------"
# -----------------------------------------------------------------------
# Pas 2: Processat del Cicle de Fitxers
# -----------------------------------------------------------------------
echo "--- Inici del Processat en Bucle ---"
for current_file in "${file_list[@]}"; do
echo "Processant fitxer: $current_file"
# Si no és el primer fitxer, es parseja fent servir el mateix patró
if [ "$current_file" != "$first_file" ]; then
# Reiniciar VAR_MAP
VAR_MAP=()
# Parsejar el nom i obtenir parts
current_filename_base="${current_file%.*}"
current_filename_ext="${current_file##*.}"
IFS="$SEPARATOR" read -r -a current_name_parts <<< "$current_filename_base"
IFS=$' \t\n'
# Verificar si el número de parts coincideix amb el patró
if [ ${#current_name_parts[@]} -ne $(( ${#FILE_VARS[@]} - 1 )) ]; then
echo "Compte!: El fitxer '$current_file' no té el mateix número de parts que el patró. Me'l salto." >&2
continue
fi
# Omplir VAR_MAP amb els valors del fitxer actual
k=0
for var_name in "${FILE_VARS[@]}"; do
if [ $k -lt ${#current_name_parts[@]} ]; then
VAR_MAP+=("$var_name=${current_name_parts[$k]}")
else
VAR_MAP+=("$var_name=$current_filename_ext")
fi
k=$((k + 1))
2025-08-04 09:57:35 +00:00
done
fi # Si és el primer fitxer, VAR_MAP ja està inicialitzat.
2025-08-04 09:57:35 +00:00
# 1. Crear FILE_ID.DIZ
if ! format_file_id_diz; then
echo "Error en crear FILE_ID.DIZ per a '$current_file'. Me'l salto." >&2
continue
2025-08-04 09:57:35 +00:00
fi
echo "-> Creat FILE_ID.DIZ."
# 2. Nom del ZIP
zip_name="$ZIPFILE$ZIPSEQ.zip"
# 3. Comprimir
# Crear una llista de fitxers per a comprimir, incloent només els que existeixen
zip_files_to_add=("$current_file" "FILE_ID.DIZ")
if [ -f "$DISCLAIMER" ]; then
zip_files_to_add+=("$DISCLAIMER")
fi
if [ -f "$DEMO" ]; then
zip_files_to_add+=("$DEMO")
fi
echo "-> Comprimint a '$zip_name'..."
if ! zip -q "$zip_name" "${zip_files_to_add[@]}"; then
echo "Error en comprimir '$current_file' a '$zip_name'. Me'l salto." >&2
rm -f FILE_ID.DIZ # Intentar esborrar fins i tot si ha fallat el ZIP
continue
fi
echo "-> Comprimit amb èxit."
# 4. Esborrar FILE_ID.DIZ
rm -f FILE_ID.DIZ
echo "-> Esborrat FILE_ID.DIZ."
# 5. Incrementar ZIPSEQ
if ! increment_zipseq "$ZIPSEQ"; then
echo "Error en incrementar la seqüència ZIPSEQ. Avortant." >&2
exit 1
fi
echo "-> ZIPSEQ actualitzat a: $ZIPSEQ"
echo "--- Fitxer $current_file processat ---"
echo ""
2025-08-04 09:57:35 +00:00
done
echo "--- Final del Processament de Fitxers ---"