Bonjour,
un script de ma réalisation, qui permet d'optimiser la taille des fichiers avec différentes opérations selon le type avec de nombreux programmes inclus ou non dans la distribution.
Ce que le script fait :
optimise la compression des archives (zip, rar, ...) et choisi une compression supérieur quand nécessaire (zip --> 7zip, ...)
optimise la compression des images (gif, png, jpg, ...)
converti les données non compressées sans perte (wav --> flac, bmp --> png, xcf --> xcf.gz, svg --> svgz, ...)
optimise le code de différents fichiers (css, php, html, ...)
efface les fichiers inutiles (temporaire, vide, ...)
Comment :
exécute uniquement si le ou les programmes existe (passe au fichier suivant si un programme n'existe pas)
conserve date de fichier original
récursivité (décompresse le contenu des archives pour une taille optimale du fichier finale, pas de conversion de format de fichier à l'intérieur d'une archive)
journalisation (~/opti.csv)
et
100% sans perte de données
Fonctionnement :
opti.sh fichier
opti.sh dossier (. pour dossier actuel)
pour l'instant le script utilise que le premier argument et ne fonctionne que avec un argument
!! a utiliser bien sur qu'a vos risque et périls, aucune garantie de fonctionnement, faites des sauvegardes et vérifier vos fichiers !!
#!/bin/bash
verify()
{
type $@ > /dev/null ||(echo "Erreur : un (ou plusieurs) programme(s) $@ non trouvé(s)"&&continue)
}
comparaison()
{
s2=$(ls -l /tmp/"$b"|awk '{print $5}')
echo "Gain "$(expr $s - $s2) soit $(echo "scale=2;(100*$s)"/$s2-100|bc)
}
extract()
{
rm -rf "/tmp/opti/$b/"
unar -nr -t -f -D -q -o "/tmp/opti/$b/" "$a" > /tmp/null
}
recur()
{
r=$(expr $r + 1)
export r
for i in ${!path[*]};do export path_$i="${path[$i]}";done
bash $0 /tmp/opti/"$b"/
r=$(expr $r - 1)
sleep 1
}
compresszip()
{
rm -rf /tmp/"$b"
if [[ $r -lt 1 ]]
then advzip -4 -a /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
else advzip -0 -a /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
fi
mv /tmp/"$b" "$a"
}
compressgz()
{
rm -rf /tmp/"$b"
if [[ $r -lt 1 ]]
then advdef -4 -a /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
s2=$(ls -l /tmp/"$b"|awk '{print $5}')
if [[ $s2 -lt $s ]];then mv /tmp/"$b" "$a";fi
else advdef -0 -a /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
mv /tmp/"$b" "$a"
fi
}
compress7z()
{
rm -rf /tmp/"$b"
ne="7z"
if [[ $r -lt 1 ]]
then 7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on /tmp/"${b%.*}".$ne /tmp/opti/"$b"/* > /tmp/null
s2=$(ls -l /tmp/"${b%.*}".$ne|awk '{print $5}')
if [[ $s2 -lt $s ]];then rm "$a"&&mv /tmp/"${b%.*}".$ne "${a%.*}".$ne;fi
else 7z a -mx=0 /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
mv /tmp/"$b" "$a"
fi
}
compressrar()
{
rm -rf /tmp/"$b"
rar a -m0 /tmp/"$b" /tmp/opti/"$b"/* > /tmp/null
mv /tmp/"$b" "$a"
}
if [[ $r == "" ]]
then r=0
path[$r]="$1"
rm ~/opti.csv 2>/dev/null
echo "level;filename;old size;new size" > ~/opti.csv
fi
mkdir /tmp/opti 2>/dev/null
find "$1" -type f \( -name '*.swp' -o -name 'wget.log' -o -name 'foobar*' -o -name '*~' -o -name '.netrwhist' -o -name "Thumbs.db" -o -name "desktop.ini" -o -name "AlbumArt*.jpg" -o -name "*.bak" -o -name "*.old" -o -name "*.log" -o -name "*.tmp" -o -name "._.DS_Store" -o -name "System Volume Information" -o -empty \)|while read a
do echo "$r;$a;$s;deleted" >> ~/opti.csv
rm -rf "$a"
done
find "$1" -empty -delete
find "$1" -type f|while read a
do b=$(basename "$a")
export a
export b
s=$(ls -l "$a"|awk '{print $5}')
ne=""
m=$(stat -c "%Y" "$a")
## lancement scan
case "${b##*.}" in
docx|DOCX|xlsx|XLSX|pptx|PPTX|epub|EPUB|odt|ODT|ods|ODS|odp|ODP|odb|ODB|odg|ODG|odf|ODF|jar|JAR)
verify unar advzip
extract
recur
compresszip
;;
7z|7Z)
verify unar 7z
extract
recur
compress7z
;;
zip|ZIP)
verify unar advzip 7z
extract
recur
if [[ $r -lt 1 ]]
then compress7z
else compresszip
fi
;;
rar|RAR)
verify unar advzip 7z
extract
recur
if [[ $r -lt 1 ]]
then compress7z
else compressrar
fi
;;
gz|GZ|tgz|TGZ|xcfgz|XCFGZ|svgz|SVGZ)
verify unar advdef
extract
recur
compressgz
;;
png|PNG|tif|TIF)
verify optipng
optipng "$a" &> /tmp/null
;;
bmp|BMP)
verify optipng
ne=png
optipng "$a" &> /tmp/null &&rm -f "$a"
;;
jpeg|JPEG|jpg|JPG)
verify jpegoptim
jpegoptim "$a" > /tmp/null
;;
xcf|XCF)
verify gzip
if [[ $r -lt 1 ]]
then
ne=xcfgz
gzip -c "$a" > /tmp/opti/"${b%.*}".$ne
advdef -4 -z /tmp/opti/"${b%.*}".$ne > /dev/null
mv /tmp/opti/"${b%.*}".$ne "${a%/*}"/"${b%.*}".$ne&&rm -f "$a"
fi
;;
exe|EXE|dll|DLL|sys|SYS|ocx|OCX|scr|SCR|cpl|CPL)
verify upx
if [[ $r -lt 1 ]]
then upx "$a" 2>&1 /tmp/null
else upx -d "$a" 2>&1 /tmp/null
fi
;;
gif|GIF)
verify gifsicle
gifsicle --optimize=3 "$a" > /tmp/opti/"$b"&&s2=$(ls -l /tmp/opti/"$b"|awk '{print $5}')&&if [[ $s2 -lt $s ]]
then mv /tmp/opti/"$b" "$a"
fi
;;
flac|FLAC)
verify flac
flac --best "$a" -f -o /tmp/opti/"$b" > /tmp/null &&mv -f /tmp/opti/"$b" "$a"
;;
wav|WAV)
verify flac
ne=flac
flac --best "$a" -f -o "${a%.*}".flac > /tmp/null &&rm -f "$a" > /tmp/null
;;
mp3|MP3)
verify mp3packer
mp3packer -f -z "$a"&&mv -f "${a%.*}"-vbr.mp3 "$a" > /tmp/null
;;
##doc|DOC|xls|XLS|chm|CHM)
##docprc.exe -b"$(dirname $a)" "$b" > /tmp/null
##;;
swf|SWF|xml|XML|xsl|XSL|xslt|XSLT|lua|LUA|rdb|RDB)
verify leanify
leanify "$a" > /tmp/null
;;
php|PHP)
sed 's|/\*|\n&|g;s|*/|&\n|g' "$a" | sed '/\/\*/,/*\//d' > "/tmp/opti/$b"&&mv -f "/tmp/opti/$b" "$a"
;;
css|CSS)
verify csstide
csstidy "$a" /tmp/opti/"$b" > /tmp/null &&mv -f /tmp/opti/"$b" "$a"
;;
js|JS)
verify shrinksafe
shrinksafe "$a" > /tmp/opti/"$b"&&s2=$(ls -l /tmp/opti/"$b"|awk '{print $5}')&&if [[ $s2 -lt $s ]]
then mv /tmp/opti/"$b" "$a"
fi
;;
svg|SVG)
verify scour.py
scour.py -i "$a" -o /tmp/opti/"$b" 2> /dev/null
if [[ "$r" -lt 1 ]]
then
ne=svgz
gzip -c /tmp/opti/"$b" > /tmp/opti/"${b%.*}".$ne
advdef -4 -z /tmp/opti/"${b%.*}".$ne > /dev/null
mv /tmp/opti/"${b%.*}".$ne "$(dirname ${a})"/"${b%.*}".$ne&&rm -f "$a"
else
mv /tmp/opti/"$b" "$a"
fi
;;
html|HTML)
verify htmlcompressor.jar
htmlcompressor.jar "$a" > /tmp/opti/"$b" &&mv /tmp/opti/"$b" "$a"
;;
mkv|MKV)
verify mkclean
mkclean --optimize "$a" /tmp/opti/"$b"&&mv /tmp/opti/"$b" "$a"
;;
##pdf|PDF)
##verify pdfsizeopt.py
##pdfsizeopt.py --use-multivalent=no "$a" /tmp/opti/"$b" 2> /dev/null &&mv /tmp/##opti/"$b" "$a"
##rm -f pso*
esac
if [[ $ne != "" ]]
then s2=$(ls -l "${a%.*}".$ne|awk '{print $5}')
touch -t $m "${a%.*}".$ne 2> /dev/null
else s2=$(ls -l "$a"|awk '{print $5}')
touch -t $m "$a" 2> /dev/null
fi
if [[ $s != $s2 ]]
then echo $r $a $s $s2
echo "$r;$a;$s;$s2" >> ~/opti.csv
fi
##echo "$r;${path[$r]};$s;$s2" >> ~/opti.csv
done
moi personnellement je trouve mon script génial et je m'en sert très régulièrement 🙂 en espérant que ça servent à quelqu'un. (et si quelqu'un connait un équivalent je suis aussi intéressé)