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;

sabato 4 gennaio 2014

Comprimere ogni file in archivio distinto

Semplice script da console (su una singola riga) per comprimere ogni file di una directory in archivi zip distinti:

for VAR in *; do zip -o "$VAR.zip" "$VAR"; done;

NB: l'opzione "-o" imposta la data e ora di aggiornamento del file zip in base alla data e ora del più vecchio file presente nell'archivio (in questo caso è solo un file).

venerdì 3 gennaio 2014

Ripetere comando fino a quando non termina correttamente

Lo script esegue il comando specificato e termina solo se il comando completa l'esecuzione correttamente (return code = 0) oppure si è raggiunto il limite massimo di tentativi.

Primo parametro: comando da eseguire (se si devono specificare dei parametri al comando da eseguire, si deve scrivere il comando ed i suoi parametri tra i doppi apici)

Secondo parametro: numero di secondi di pausa prima di ritentare l'esecuzione.

Terzo parametro (opzionale): massimo numero di tentativi prima di terminare definitivamente.

repeatWhileReturnCodeKo.sh
#!/bin/bash
function repl {
printf "$1"'%.s' $(eval "echo {1.."$(($2))"}"); echo ""
}

x=1
lenriga=80
char="="
ret="1"
if [ $# -lt 2 ]
then
echo "Uso: `basename $0` COMANDO_DA_ESEGUIRE_RIPETUTAMENTE PAUSA_SECONDI [MAX_TENTATIVI]"
exit 1
fi
timeout=$2

max=0
if [ $# -gt 2 ]; then
max=$3
fi
echo "max = $max"
while [ "$ret" -ne "0" ]
do
tempo=$(date +%Y-%m-%d_%H:%M:%S)
repl $char $lenriga
echo "$tempo - Avvio # $x di '$1'..."
$1
ret="$?"
tempo=$(date +%Y-%m-%d_%H:%M:%S)
if [ "$ret" -ne "0" ]; then
if [ "$max" -eq "$x" ]; then
repl $char $lenriga
echo "$tempo - Raggiunto il numero massimo di tentativi (# $max)."
echo "$tempo - Comando '$1' terminato con ERRORE. Return code = $ret"
exit $ret;
fi
echo ""
echo ""
repl $char $lenriga
echo "$tempo - Comando '$1' terminato con ERRORE. Return code = $ret"
echo "$tempo - Pausa di $timeout secondi prima di riavviare '$1'..."
sleep $timeout
x=$(( $x + 1 ))
else
echo "$tempo - Comando '$1' terminato con SUCCESSO."
fi
done
exit $ret;

Cercare i file di grande dimensione

Ad esempio per cercare file con una dimensione maggiore o uguale a 100 Mb:

find . -type f -size +100M -exec echo {} \;

Abilita il riconoscimento della sd-card con errore "No NAND device found"

Abilita il riconoscimento della sd-card nel mio PC Dell con le nuove *Ubuntu.

Inserire la SD-Card ed avviare il seguente script:

sdcard-abilita.sh
#!/bin/bash
sudo modprobe -r r852
sudo modprobe -r sdhci_pci
sudo modprobe r852
sudo modprobe sdhci_pci

Disabilita il fastidioso "beep" da console in alcuni terminali

Disabilita il fastidioso "beep" da console in alcuni terminali.

noBeep.sh
#!/bin/bash
setterm -blength 0
exit 0;

Avviso acustico comando terminato

Per essere avvisati acusticamente al termine dell'esecuzione di un comando.
Esempio uso: $ comando && bell.sh

bell.sh
#!/bin/bash
play -q /usr/share/sounds/KDE-Sys-Warning.ogg
exit 0