diff --git a/README.md b/README.md index 4fe927e..afb08c2 100644 --- a/README.md +++ b/README.md @@ -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. \ No newline at end of file +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` + +`` + +[^1]: El fitxer ha d'estar present a la ruta on s'executi l'*script*. \ No newline at end of file diff --git a/mass-diz.sh b/mass-diz.sh new file mode 100644 index 0000000..7569679 --- /dev/null +++ b/mass-diz.sh @@ -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."