Carrega massiva inicial

Primera versió productiva de l'*script* més la versió depurada de la documentació inicial.
This commit is contained in:
Kishpa 2025-06-27 11:50:15 +02:00
parent de59da8dd7
commit 9e66bcebe8
2 changed files with 208 additions and 2 deletions

View File

@ -1,3 +1,93 @@
# bash-mass-diz-zip # mass-diz
Script per a generar automàticament a partir d'un fitxer - oconjunt de fitxers- un 'ZIP' que contingui el fitxer, el seu 'FILE_ID.DIZ', els fitxers de suport necessaris, etc. Script per a generar automàticament a partir d'un conjunt de fitxers, una seqüència de 'ZIP' que contingui cada un dels fitxers, el seu respectiu 'FILE_ID.DIZ' i els fitxers de suport necessaris.
## Situació
A `Eye Of The Beholder BBS` tots els elements que s'ofereixen als usuaris, a través de la seva base de fitxers, respecten les següents característiques:
- Es presenten comprimits en format `ZIP`.
- Inclouen un fitxer de descàrrec (`DISCLAIMER`).
- Inclouen un fitxer de demo i/o publictat de `EOTB`.
- Inclouen el fitxer de descripció de l'element (`FILE_ID.DIZ`).
### Problema
El programari `BBBS` no implementa cap utilitat que permeti generar aquest paquetitzat de fitxers d'una manera automàtica.
Si bé per a la preparació d'e fitxers'elements individuals es pot optar per l'operació manual, davant de situacions on cal preparar una quantitat seqüencial d'elements la manualitat es converteix en una operació feixuga i tediosa.
Imaginem alguns casos d'aquests elements seqüencials:
- Col·leccions de fitxers (p. ex. una sèrie de capítols d'un còmic, a fitxer per capítol)
- Fitxers serialitzats (p. ex. un fitxer de gran mida comprimit en volums, a fitxer per volum)
- Conjunt de fitxers independents en una carpeta comuna (p. ex. les fotografies diàries que fa la NASA, a fitxer per foto)
En qualsevol d'aquests casos, l'esforç és molt superior al benefici i, en el meu cas, justifica que tingui *terabytes* d'informació pendents d'incorporar a `EOTB`.
## Solució
He desenvolupat `mass-diz.sh`, un *script* en `bash` que ha de donar resposta a aquesta necessitat, com a eina de suport pròpia i de qualsevol altre `SysOp`.
`mass-diz.sh` empaqueta en un `ZIP` els diferents elements i els annexes necessàris, incloent-hi el `FILE_ID.DIZ` associat que es genera durant l'execució.
### Requisits
`mass-diz.sh` necessita que les utilitats `read`, `zip`, `file` i `echo` estiguin disponibles al sistema per tal de poder efectuar les operacions necessàries.
Tanmateix, aquest *script* s'ha provat en un `shell` `bash` compatible, de manera que si fas servir un altre `shell` pot ser necessari ajustar-lo en corcondança. Això podria aplicar-se a `Windows WSL` fent possible executar aquest *script* en qualsevol instal·lació de programari `BBS` sobre `MS Windows`.
### Funcionalitat:
`mass-diz.sh` està pensat per a processar seqüencies de fitxers pertanyents a col·leccions, el nom dels quals respecti una estructura semblant i aporta tota l'informació sobre el fitxer en valors separats per un conjunt de caracters determinats:
P.ex. `Daredevil Born Again - Season 1 - Chapter 2 - 1080p - 2025.mkv`
- **Variables Inicials**: L'*script* parteix d'un conjunt de variables fixes, que s'inicialitzen durant la seva execució:
- `DISCLAIMER`: El nom del fitxer[^1] informatiu de descàrrec quan l'element és un contingut sensible.
- `DEMO`: El nom del fitxer [^1] que fa les funciones de publicitat/promoció de `EOTB`.
- `SEPARATOR`: El caràcter o conjunt de caràcters que identifiquen els diferents camps de la descripció de l'element.
- `FILE_ID`: S'alimenta automàticament durant l'execució de l'*script*.
- `ZIPFILE`: El nom base que tindrà el fitxer `ZIP` resultant.
- `ZIPSEQ`: El número de seqüència inicial que es concatenarà a la variable `ZIPFILE`.
`mass-diz.sh` processarà tots els fitxers existents a la ruta on se l'invoqui, a excepció dels que es defineixin a les variables `DISCLAIMER` i `DEMO`.
El primer fitxer definirà el patró de comportament que l'*script* tindrà, tant per aquest com per a la resta de fitxers.
L'*script* analitzarà el nom complet utilizant com a separador el valor de la variable `SEPARATOR`.
Per a cada valor identificat entre separadors, preguntarà el nom d'una nova variable que informarà amb el valor identificat. Per al valor d'extensió del fitxer (assumint-lo a la dreta del punt), ha de preguntar també el nom de la variable.
Un cop s'hagi analitzat el nom i extensió del fitxer, i tot el seu contingut estigui informat en variables, l'*script* sol·licita ordenar-les.
A continuació, s'informarà la variable `FILE_ID` (no inicialitzada) concatenant les variables existents amb les següents condicions:
- La variable `TITLE` es converteix a majúscules i s'aboca a la variable `FILE_ID`.
- La resta de variables, s'aboquen una per línia, segons l'ordre establert, respectant un format `clau: valor`.
- A cada línia, la variable es converteix en la clau de línia (el mateix nom de la variable sense el símbol `$`), concatenant el símbol `:`, afegint un espai, i abocant el valor de la variable.
La variable `FILE_ID` s'abocarà a un nou fitxer amb el nom fixe establert `FILE_ID.DIZ` que contindrà un màxim de 45 caràcters per línia.
En aquest punt, es comprimirà en format `ZIP` el fitxer processat, el fitxer `FILE_ID.DIZ`, més els fitxers de les variables `DISCLAIMER` i `DEMO`. El nom d'aquest `zip` és el resultant de concatenar els valors de les variables `ZIPFILE` i `ZIPSEQ`.
Després del comprimit amb èxit, s'esborra el fitxer `FILE_ID.DIZ`.
A continuació, es suma `1` a la variable `ZIPSEQ`, i es torna a executar el procés per a la resta de fitxers presents a la ruta on s'ha executat l'*script*, assumint l'ordre establert en l'execució del primer fitxer processat.
### Execució:
En el `path` on s'executa:
- **Únic mode d'execució**: `mass-diz.sh`
`<EOF>`
[^1]: El fitxer ha d'estar present a la ruta on s'executi l'*script*.

116
mass-diz.sh Normal file
View File

@ -0,0 +1,116 @@
#!/bin/bash
# Variables no inicialitzades
DISCLAIMER=""
DEMO=""
SEPARATOR=""
FILE_ID=""
ZIPFILE=""
ZIPSEQ=""
# Preguntar el nom del fitxer Disclaimer
read -p "Introdueix el nom del fitxer Disclaimer: " DISCLAIMER
# Preguntar el nom del fitxer Demo
read -p "Introdueix el nom del fitxer Demo: " DEMO
# Preguntar què fa de separador de camps
read -p "Introdueix el separador de camps: " SEPARATOR
# Preguntar el nom base del futur ZIP comprimit
read -p "Introdueix el nom base del ZIP Comprimit: " ZIPFILE
# 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
# 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
fi
# 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##*.}"
# Parsejar el nom del fitxer aplicant el separador definit a SEPARATOR
IFS="$SEPARATOR" read -ra components <<< "$filename"
# 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
# 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"
# Demanar l'ordre de les variables
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
# Generar el FILE_ID
TITLE=$(echo "${var_map[${order[0]}]}" | tr '[:lower:]' '[:upper:]')
FILE_ID="$TITLE"
echo "Generant FILE_ID..."
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))
fi
done
echo "Procés completat."