Pagine

lunedì 6 gennaio 2014

Comprimere ogni file con gestione dir di supporto ai file html

Questo script permette di comprimere file singolarmente, ma in presenza di file html, verifica se esiste anche la relativa directory di supporto. Se esiste allora il file e la directory html saranno compressi insieme, invece che separatamente.

Esempio:
File e directory da elaborare:
./
../
apache2/
Blogger: Roby's script - Modifica post_files/
Blogger: Roby's script - Modifica post.html
Comandi/
eclipse_sts_tooltip_color/
File di testo
info tipo filesystem.txt
mvn-archetype_generate.odt
Roby's blog_files/
Roby's blog.html
SpringBatch/
zipFileDistinti.sh.zip

Output dello script:
$ ./zipFileDistinti.sh Doc-Linux/
File: 6
zip di "./Blogger: Roby's script - Modifica post.html"
\-- con la dir: "Blogger: Roby's script - Modifica post_files"
zip di "./info tipo filesystem.txt"
zip di "./Roby's blog.html"
\-- con la dir: "Roby's blog_files"
zip di "./File di testo"
file "./zipFileDistinti.sh.zip"
\-- già compresso lo salto
zip di "./mvn-archetype_generate.odt"

Directory: 4
zip della dir: "./Comandi"
zip della dir: "./eclipse_sts_tooltip_color"
zip della dir: "./SpringBatch"
zip della dir: "./apache2"

Risultato:
./
../
apache2.zip
Blogger_Robys_script_-_Modifica_post.html.zip
Comandi.zip
eclipse_sts_tooltip_color.zip
File_di_testo.zip
info_tipo_filesystem.txt.zip
mvn-archetype_generate.odt.zip
Robys_blog.html.zip
SpringBatch.zip
zipFileDistinti.sh.zip

NB1: Nello script sono riportati un bel pò di concetti...!
NB2: Naturalmente si poteva risolvere con diverse modalità, questo è il mio esempio a scopo didattico... (comunque funziona!).

zipFileDistinti.sh

#!/bin/bash
# aggiungere -x alla riga precedente per avviare in modalità debug


function testFileHtml {
dirColl=""
file=`echo $1 | sed 's/^\.\///'`
file "$file" | grep -q "HTML document"
if [ "$?" -eq "0" ]; then
file_name=$(basename "$file")
file_name_no_ext=${file_name%.*}
file_name_no_ext=$file_name_no_ext"_files"

grep -q "$file_name_no_ext" "$file"
if [ "$?" -ne "0" ]; then
file_name_no_ext20=$(python -c "import urllib; print urllib.quote('''$file_name_no_ext''')")


grep -q "$file_name_no_ext20" "$file"
fi
if [ "$?" -ne "0" ]; then
file_name_no_ext20=`echo $file_name_no_ext20 | sed 's/\%3A/:/g'`


grep -q "$file_name_no_ext20" "$file"
fi

if [ "$?" -eq "0" ]; then
dirColl=$file_name_no_ext
fi
fi
}

function nomeZip {
file=`echo $1 | sed 's/^\.\///'`
file=$(python -c "import string; valid_chars = '-_.() %s%s' % (string.ascii_letters, string.digits); print ''.join(c for c in '''$file''' if c in valid_chars)")
file=`echo $file | sed 's/[[:space:]]/_/g'`
fileZip="$file"
fileZipOrig=$fileZip

COUNTER=1
while [ -f "$fileZip.zip" ]; do
let COUNTER+=1
echo " \\-- \""$fileZip".zip\" esiste già: aggiungo suffisso \"$COUNTER\" al nome del nuovo zip..."
fileZip=$fileZipOrig"_""$COUNTER"
done
fileZip="$fileZip.zip"
}

if [ $# -ne 1 ]
then
echo "Uso: `basename $0` DIR"
exit 1
fi

dirWork="$1"
if [ ! -d "$dirWork" ]
then
echo "La directory: \"""$dirWork""\" non esiste!"
exit 1
fi

oldDir=`pwd`
cd "$dirWork"

ZIPCOMMANDSFILE="zip -m -T"
ZIPCOMMANDSDIR="zip -r -m -T"

unset arrayFile arrayDir i
while IFS= read -r -d $'\0' file; do
arrayFile[i++]="$file"
done < <(find . -maxdepth 1 -type f -print0)


unset i
while IFS= read -r -d $'\0' file; do
if [ "." != "$file" ]; then
arrayDir[i++]="$file"
fi
done < <(find . -maxdepth 1 -type d -print0)


totDir=${#arrayDir[*]}

echo "File: ${#arrayFile[*]}"
for ix in ${!arrayFile[*]}
do
fileArchivio=`echo "${arrayFile[ix]}" | sed -n '/.zip$/p'`
if [ ! -z "$fileArchivio" ]; then
echo "file \"$fileArchivio\""
echo " \\-- già compresso lo salto"
continue;
fi

#printf $ix" %s\n" "${arrayFile[$ix]}"

testFileHtml "${arrayFile[ix]}"
if [ "$dirColl" != "" ]; then
for iy in ${!arrayDir[*]}
do
#printf $iy" %s\n" "${arrayDir[$iy]}"
if [ "${arrayDir[$iy]}" == "./$dirColl" ]; then
arrayDir[$iy]=""
totDir=$((totDir - 1))
# Eventualmente per rimuovere l'elemento dall'array: arrayDir=(${arrayDir[@]:0:$iy} ${arrayDir[@]:$(($iy + 1))})
break;
fi
done

echo "zip di \"""${arrayFile[$ix]}""\""
echo " \\-- con la dir: \""$dirColl"\""

nomeZip "${arrayFile[$ix]}"
$ZIPCOMMANDSDIR "$fileZip" "${arrayFile[$ix]}" "$dirColl" 1>/dev/null
else
echo "zip di \"""${arrayFile[$ix]}""\""
nomeZip "${arrayFile[$ix]}"
$ZIPCOMMANDSFILE "$fileZip" "${arrayFile[$ix]}" 1>/dev/null
fi
done
echo

echo "Directory: ${totDir}"
for ix in ${!arrayDir[*]}
do
#printf $ix" %s\n" "${arrayDir[$ix]}"
if [ ! -z "${arrayDir[$ix]}" ]; then
echo "zip della dir: \"""${arrayDir[$ix]}""\""
nomeZip "${arrayDir[$ix]}"
$ZIPCOMMANDSDIR "$fileZip" "${arrayDir[$ix]}" 1>/dev/null
fi
done
echo

cd "$oldDir"
exit 0;

Nessun commento:

Posta un commento