From a950181498fefb427b8d2f6021982d45465439c5 Mon Sep 17 00:00:00 2001 From: Kishpa Date: Mon, 20 Oct 2025 10:28:48 +0200 Subject: [PATCH] =?UTF-8?q?Canvi=20de=20versi=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La primera versió de l'script no gestionava bé els espais i l'ordre de variables. Pujo nova versió reformatant tot el procés i marcant cada passa del procés. --- mass-diz.sh | 340 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 244 insertions(+), 96 deletions(-) diff --git a/mass-diz.sh b/mass-diz.sh index 7569679..5fdf931 100644 --- a/mass-diz.sh +++ b/mass-diz.sh @@ -1,116 +1,264 @@ #!/bin/bash -# Variables no inicialitzades -DISCLAIMER="" -DEMO="" -SEPARATOR="" -FILE_ID="" -ZIPFILE="" -ZIPSEQ="" +# ======================================================================= +# 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 -# Preguntar el nom del fitxer Disclaimer -read -p "Introdueix el nom del fitxer Disclaimer: " DISCLAIMER +# ======================================================================= +# Funcions +# ======================================================================= -# Preguntar el nom del fitxer Demo -read -p "Introdueix el nom del fitxer Demo: " DEMO +# 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\"" +} -# Preguntar què fa de separador de camps -read -p "Introdueix el separador de camps: " SEPARATOR +# 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 -# Preguntar el nom base del futur ZIP comprimit -read -p "Introdueix el nom base del ZIP Comprimit: " ZIPFILE + # 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 + done -# Preguntar el número inicial de seqüència del ZIP comprimit -read -p "Introdueix el número inicial de seqüència del zip comprimit: " ZIPSEQ + if [ -z "$var_value" ]; then + echo "Error intern: Valor per a '$var_name' no trobat." >&2 + continue + fi -# Processar tots els fitxers, a excepció dels definits a DISCLAIMER i DEMO -for file in *; do - if [[ "$file" == "$DISCLAIMER" || "$file" == "$DEMO" ]]; then - # Si el fitxer és DISCLAIMER o DEMO, l'ignorem - echo "Ignorant fitxer $file." - continue + 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 + + # 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 +} - # Primer fitxer amb el que establim el patró d'execució - if [[ -z "$pattern_set" ]]; then - pattern_set=true - echo "Processant primer fitxer per a establir el patró: $file" - - # Separar nom de fitxer i extensió - filename="${file%.*}" - extension="${file##*.}" +# 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 +} - # Parsejar el nom del fitxer aplicant el separador definit a SEPARATOR - IFS="$SEPARATOR" read -ra components <<< "$filename" +# ======================================================================= +# Interacció amb l'Usuari per a Configuració Inicial +# ======================================================================= - # Preguntar pels noms de les variables - # Fer servir la variable TITLE facilita que el títol del fitxer es convertirà després a majúscules - declare -A var_map - for (( i=0; i<${#components[@]}; i++ )); do - read -p "Introdueix el nom de la variable per al valor '${components[$i]}': " var_name - var_map[$var_name]="${components[$i]}" - done +echo "--- Configuració Inicial de l'Script ---" - # Preguntar pel nom de la variable per a l'extensió - read -p "Introdueix el nom de la variable per a l'extensió '$extension': " ext_var - var_map[$ext_var]="$extension" +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" - # Demanar l'ordre de les variables - echo "Les variables detectades són:" - for key in "${!var_map[@]}"; do - echo "$key: ${var_map[$key]}" - done +echo "----------------------------------------" - read -p "Introdueix l'ordre de les variables (separades per espais): " -a order +# 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 - # Generar el FILE_ID - TITLE=$(echo "${var_map[${order[0]}]}" | tr '[:lower:]' '[:upper:]') - FILE_ID="$TITLE" - echo "Generant FILE_ID..." +# ======================================================================= +# Processat de Fitxers +# ======================================================================= - for var_name in "${order[@]:1}"; do - FILE_ID+=$'\n'"$var_name: ${var_map[$var_name]}" - done - - # Crear el fitxer FILE_ID.DIZ - echo "$FILE_ID" | fold -w 45 > "FILE_ID.DIZ" - echo "Fitxer FILE_ID.DIZ generat." - - # Comprimir el fitxer original, DISCLAIMER, DEMO i el FILE_ID.DIZ - zip_name="${ZIPFILE}${ZIPSEQ}.zip" - zip "$zip_name" "$file" "FILE_ID.DIZ" "$DISCLAIMER" "$DEMO" - echo "Fitxers comprimits a $zip_name." - - # Esborrar el fitxer FILE_ID.DIZ - rm "FILE_ID.DIZ" - - # Incrementar la seqüència ZIPSEQ - ZIPSEQ=$((ZIPSEQ + 1)) - - else - # Processar la resta de fitxers fent servir el patró establert - echo "Processant fitxer: $file" - - # Separar el nom i l'extensió com abans - filename="${file%.*}" - extension="${file##*.}" - IFS="$SEPARATOR" read -ra components <<< "$filename" - - # Generar el FILE_ID fent servir l'ordre anterior - TITLE=$(echo "${components[0]}" | tr '[:lower:]' '[:upper:]') - FILE_ID="$TITLE" - for (( i=1; i<${#order[@]}; i++ )); do - var_name="${order[$i]}" - FILE_ID+=$'\n'"$var_name: ${components[$i]}" - done - - # Crear i comprimir el fitxer com abans - echo "$FILE_ID" | fold -w 45 > "FILE_ID.DIZ" - zip_name="${ZIPFILE}${ZIPSEQ}.zip" - zip "$zip_name" "$file" "FILE_ID.DIZ" "$DISCLAIMER" "$DEMO" - rm "FILE_ID.DIZ" - ZIPSEQ=$((ZIPSEQ + 1)) +# 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 -echo "Procés completat." +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 + +# 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[@]}" + +# 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 + +# 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)) + done + fi # Si és el primer fitxer, VAR_MAP ja està inicialitzat. + + # 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 + 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 "" + +done + +echo "--- Final del Processament de Fitxers ---"