Canvi de versió
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.
This commit is contained in:
parent
e72d5b1cd9
commit
a950181498
340
mass-diz.sh
340
mass-diz.sh
|
|
@ -1,116 +1,264 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Variables no inicialitzades
|
# =======================================================================
|
||||||
DISCLAIMER=""
|
# Variables no inicialitzades (només declarades per a referència)
|
||||||
DEMO=""
|
# =======================================================================
|
||||||
SEPARATOR=""
|
DISCLAIMER="" # Nom del fitxer Disclaimer
|
||||||
FILE_ID=""
|
DEMO="" # Nom del fitxer Demo
|
||||||
ZIPFILE=""
|
SEPARATOR="" # Caràcter/conjunt de caràcters del separador de camps
|
||||||
ZIPSEQ=""
|
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
|
# Función para solicitar entrada al usuario
|
||||||
read -p "Introdueix el nom del fitxer Demo: " DEMO
|
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
|
# Funció per a formatar i abocar el contingut de FILE_ID.DIZ
|
||||||
read -p "Introdueix el separador de camps: " SEPARATOR
|
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
|
# Omplir line_content amb el contingut formatat
|
||||||
read -p "Introdueix el nom base del ZIP Comprimit: " ZIPFILE
|
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
|
if [ -z "$var_value" ]; then
|
||||||
read -p "Introdueix el número inicial de seqüència del zip comprimit: " ZIPSEQ
|
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
|
if [[ "$var_name" == "TITLE" ]]; then
|
||||||
for file in *; do
|
# Condició 1: TITLE es converteix a majúscules
|
||||||
if [[ "$file" == "$DISCLAIMER" || "$file" == "$DEMO" ]]; then
|
title_content="${var_value^^}"
|
||||||
# Si el fitxer és DISCLAIMER o DEMO, l'ignorem
|
else
|
||||||
echo "Ignorant fitxer $file."
|
# Condició 2: Altres variables: Nom: Valor
|
||||||
continue
|
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
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# Primer fitxer amb el que establim el patró d'execució
|
# Funció per a incrementar ZIPSEQ
|
||||||
if [[ -z "$pattern_set" ]]; then
|
increment_zipseq() {
|
||||||
pattern_set=true
|
local current_seq="$1"
|
||||||
echo "Processant primer fitxer per a establir el patró: $file"
|
local seq_len="${#current_seq}"
|
||||||
|
# M'asseguro que la seqüència es tracti com un número
|
||||||
# Separar nom de fitxer i extensió
|
local new_num=$((10#$current_seq + 1))
|
||||||
filename="${file%.*}"
|
# Formata de nou amb zeros a l'esquerra
|
||||||
extension="${file##*.}"
|
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
|
echo "--- Configuració Inicial de l'Script ---"
|
||||||
# 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
|
|
||||||
|
|
||||||
# Preguntar pel nom de la variable per a l'extensió
|
ask_user "Informa el nom del fitxer Disclaimer" "DISCLAIMER"
|
||||||
read -p "Introdueix el nom de la variable per a l'extensió '$extension': " ext_var
|
ask_user "Informa el nom del fitxer Demo" "DEMO"
|
||||||
var_map[$ext_var]="$extension"
|
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 "----------------------------------------"
|
||||||
echo "Les variables detectades són:"
|
|
||||||
for key in "${!var_map[@]}"; do
|
|
||||||
echo "$key: ${var_map[$key]}"
|
|
||||||
done
|
|
||||||
|
|
||||||
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:]')
|
# Processat de Fitxers
|
||||||
FILE_ID="$TITLE"
|
# =======================================================================
|
||||||
echo "Generant FILE_ID..."
|
|
||||||
|
|
||||||
for var_name in "${order[@]:1}"; do
|
# Obtenir la llista de fitxers a processar (tots menys . i .., i els definits)
|
||||||
FILE_ID+=$'\n'"$var_name: ${var_map[$var_name]}"
|
file_list=()
|
||||||
done
|
for f in *; do
|
||||||
|
if [ -f "$f" ] && [ "$f" != "$DISCLAIMER" ] && [ "$f" != "$DEMO" ] && [ "$f" != "FILE_ID.DIZ" ] && [ "$f" != "$0" ]; then
|
||||||
# Crear el fitxer FILE_ID.DIZ
|
file_list+=("$f")
|
||||||
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))
|
|
||||||
fi
|
fi
|
||||||
done
|
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 ---"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue