#!/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 # ======================================================================= # 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\"" } # 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 # 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 if [ -z "$var_value" ]; then echo "Error intern: Valor per a '$var_name' no trobat." >&2 continue fi 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 } # 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 # ======================================================================= echo "--- Configuració Inicial de l'Script ---" 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" echo "----------------------------------------" # 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 # 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 ---"