#1 Le 18/11/2010, à 03:11
- Tetsumaki
Besoin d'aide, création d'un script de compression/décompression
Salut à tous.
J'ai envi de me créer un script de compression/décompression grâce au bash et zenity.
Pour l'instant je me suis limité au format 7-Zip étant donné que j'arrive pas à avancer, c'est pourquoi je vous demande votre aide.
En gros pour l'instant ça donne ça :
Au lancement.
Ce qu'on veut compresser.
Répertoire de destination.
Nom de l'archive.
Le script :
#!/bin/sh
tetsuAction=`zenity --list --title="Que voulez-vous faire ?" --column="Action" "Compression" "Decompression"`
if [ "$tetsuAction" = "Compression" ]; then
tetsuSrc=`zenity --file-selection --multiple --separator=" "`
tetsuDest=`zenity --file-selection --directory`
tetsuFname=`zenity --entry --text="Entrez un nom pour l'archive"`
7z a -mx=9 -m0=lzma2 ${tetsuDest}/${tetsuFname} ${tetsuSrc}
#roxterm -e 7z a -mx=9 -m0=lzma2 ${tetsuDest}/${tetsuFname} ${tetsuSrc}
elif [ "$tetsuAction" = "Decompression" ]; then
zenity --info --text="Decomp"
else
exit
fi
Maintenant mon problème :
Ça fonctionne seulement si je sélectionne 1 seul fichier et il ne doit y avoir d'espace ni sur le nom, ni dans les répertoires.
Je pense que c'est une histoire de guillemet mais tout ce que j'ai pu tester jusqu'ici ne marche pas.
Pour info voici à quoi ressemble la ligne de commande pour compresser avec 7-Zip :
1 fichier :
7z a -mx=9 -m0=lzma2 "/home/user/destination.7z" "/home/user/fichier_a_compresser.ext"
Plusieurs fichiers :
7z a -mx=9 -m0=lzma2 "/home/user/destination.7z" "/home/user/fichier_a_compresser1.ext" "/home/user/fichier_a_compresser2.ext" "/home/user/fichier_a_compresser3.ext"
Merci par avance.
Dernière modification par Tetsumaki (Le 19/11/2010, à 06:30)
Hors ligne
#2 Le 18/11/2010, à 04:29
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
OLDIFS=$IFS IFS=$'\n'
tetsuSrc=(`zenity --file-selection --multiple --separator=$'\n'`)
IFS=$OLDIFS
tetsuDest=`zenity --file-selection --directory`
tetsuFname=`zenity --entry --text="Entrez un nom pour l'archive"`
7z a -mx=9 -m0=lzma2 "${tetsuDest}/${tetsuFname}" "${tetsuSrc[@]}"
Sauf, bien sur, si quelqu'un s'amuse à ajouter des retours à la ligne dans les noms des fichiers, mais malheureusement l'unique caractère (sauf /) interdit dans les noms de fichiers (NULL) est aussi interdit dans les variables bash.
Dernière modification par chopinhauer (Le 18/11/2010, à 04:31)
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#3 Le 18/11/2010, à 13:15
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
En fait voici ce que me retourne le shell quand je fais une simulation avec 2 fichiers sélectionné :
7z a -mx=9 -m0=lzma2 /home/tetsumaki/Desktop/fichier compresse.7z /home/tetsumaki/fichier test 1 /home/tetsumaki/fichier test 2
J'aimerais que ça me sorte ça :
7z a -mx=9 -m0=lzma2 "/home/tetsumaki/Desktop/fichier compresse.7z" "/home/tetsumaki/fichier test 1" "/home/tetsumaki/fichier test 2"
Hors ligne
#4 Le 18/11/2010, à 16:26
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Ha bah en fait ton code fonctionne, j'avais testé la première fois et ça ne marchait pas j'avais du mal m'y prendre.
Je ne comprend pas à quoi sert IFS ? ainsi que le [@] que tu as ajouté, peux tu m'expliquer ?
Merci.
EDIT : Je crois que j'ai compris en fait ça interprète de cette manière :
Exemple :
7z a -mx=9 -m0=lzma2 "/home/tetsumaki/Desktop/test1000.7z" "/mnt/1to/test/fichier 01.avi" \
"/mnt/1to/test/fichier 02.avi" \
"/mnt/1to/test/fichier 03.avi" \
"/mnt/1to/test/fichier 04.avi"
C'est bien ça ?
Dernière modification par Tetsumaki (Le 18/11/2010, à 16:36)
Hors ligne
#5 Le 18/11/2010, à 16:37
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
Après une expansion arithmétique, substitution de commande ou de paramètre le shell coupe le résultat en mots (sauf si ces opération sont dans des guillemets ") en utilisant la valeur de IFS comme séparateur (d'habitude <espace><tabulation><retour à la ligne>). La construction var=( ) défini un tableau (array) avec comme éléments les mots qui sont à l'intérieur et la forme "${var[@]}" donne tous les éléments du tableau, un mot par élément.
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#6 Le 18/11/2010, à 16:39
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
C'est bien ça ?
Mets un set -x au début du script et tu verras tout ce que le shell fait.
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#7 Le 18/11/2010, à 16:43
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Merci et merci pour set -x si j'avais su plus tôt ça m'aurait bien aidé.
Je mets le poste comme résolu )
Et encore un autre merci
Hors ligne
#8 Le 18/11/2010, à 17:17
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Juste une chose encore, tu connais Zenity ou pas ?
En fait j'aimerais savoir sil il est possible d'afficher le % de compression/decompression dans zenity --progress ?
Hors ligne
#9 Le 18/11/2010, à 17:33
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
Je n'utilise pas vraiment Zenity, mais il lit le pourcentage sur son entrée standard, donc si tu modifie correctement la sortie de 7z, zenity devrait pouvoir te montrer une belle progression.
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#10 Le 18/11/2010, à 18:37
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Ok merci.
Hors ligne
#11 Le 19/11/2010, à 06:32
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
J'ai un autre problème maintenant.
J'aimerais raccourcir ceci :
fileType=`file "${src}" | egrep ": 7-zip archive data|: Zip archive data|: ARJ archive data|: RAR archive data"`
if [ "${fileType}" != "" ]; then
${terminal} 7z x "${src}"
else
et inclure directement le egrep dans le if car j'ai des elif derrière et de cette façon c'est vraiment laid.
J'aimerais un code de ce genre mais qui fonctionne :
if [ `file "${src}" | egrep ": 7-zip archive data|: Zip archive data|: ARJ archive data|: RAR archive data"` != "" ]; then
${terminal} 7z x "${src}"
else
Merci
EDIT :
Bon à priori j'ai réussi de cette façon :
if [ "(`file "${src}" | egrep ": 7-zip archive data|: Zip archive data|: ARJ archive data|: RAR archive data"`)" != "" ]; then
Qu'en pensez-vous ?
Dernière modification par Tetsumaki (Le 19/11/2010, à 06:34)
Hors ligne
#12 Le 19/11/2010, à 16:03
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
Tu peux demander à file le type MIME au lieu de la description :
file -b --mime-type fichier
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#13 Le 19/11/2010, à 16:50
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Tu peux demander à file le type MIME au lieu de la description :
file -b --mime-type fichier
C'est vrai que c'est déjà plus propre comme ça.
Merci
Hors ligne
#14 Le 19/11/2010, à 17:21
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Voici déjà les prémisses du code qui me permet d'extraire.
Il s'intègre au clic droit dans Gnome en "Extraire ici" mais j'ai le même en "Extraire vers" (avec Zenity).
J'utilise "roxterm" comme terminal et si vous en utilisez un autre comme par exemple "gnome-terminal" ou autres vous devez adapter la ligne :
terminal="roxterm --separate -e"
Je vais ajouter d'autres formats pris en charge mais si vous avez des conseils je suis preneur :
#!/bin/sh
terminal="roxterm --separate -e"
for src in "${@}"; do
case `file -b --mime-type "${src}"` in
# tar
"application/x-tar")
${terminal} tar xf "${src}" -v;;
# 7z, rar, zip, arj, cbr, jar, lzma, exe
"application/octet-stream" | "application/x-rar" | "application/zip" | "application/x-arj")
${terminal} 7z xv "${src}";;
# bzip2
"application/x-bzip2")
${terminal} tar xjf "${src}" -v;;
# xz
"application/x-xz")
${terminal} tar xJf "${src}" -v;;
# gz
"application/x-gzip")
${terminal} tar xzf "${src}" -v;;
# ar
"application/x-archive")
${terminal} ar x "${src}";;
esac
done
exit 0
Autre question : Existe t-il une alternative aussi pratique que Zenity qui s'intègre au SHELL ?
Dernière modification par Tetsumaki (Le 19/11/2010, à 17:39)
Hors ligne
#15 Le 19/11/2010, à 17:37
- chopinhauer
Re : Besoin d'aide, création d'un script de compression/décompression
Juste une remarque : application/octet-stream est le type MIME de tout fichier binaire non reconnu.
Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.
Hors ligne
#16 Le 19/11/2010, à 17:40
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Ok merci mais c'est pratique pour décompresser des .exe avec 7-zip parfois.
Hors ligne
#17 Le 19/11/2010, à 19:05
- Tetsumaki
Re : Besoin d'aide, création d'un script de compression/décompression
Donc voilà mes 3 scripts qui s'intègrent au clic-droit dans Nautilus, les scripts pour "compresser" et "extraire vers" dépendent de Zenity.
Il faut modifier la variable terminal si vous n'utilisez pas roxterm par gnome-terminal, konsole, etc... :
terminal="roxterm --separate -e"
Dans roxterm :
--separate : Use a separate process to run this terminal
-e : Execute remainder of command line inside the terminal. Must be the final option.
Donc à bien adapter à son terminal.
Je pense que ça servira à d'autres personnes.
Compresser :
#!/bin/sh
terminal="roxterm --separate -e"
# Nom de l'archive
destName=`zenity --entry --title="Nom de l'archive" --text="Saisissez un nom pour l'archive"`
if [ "${destName}" = "" ]; then
exit
fi
# Format de l'archive
destFormat=`zenity --list --title="Format souhaité" --radiolist --column="Choix" --column="Format" "" "7z" "" "rar" "" "tar" "" "tar.bz2" "" "tar.xz" "" "tar.lzma" "" "tar.lzip" "" "tar.lzop" "" "tar.gz"`
if [ "${destFormat}" = "" ]; then
exit
fi
# Répertoire de destination
destDir=`zenity --file-selection --directory --title="Répertoire de destination"`
if [ "${destDir}" = "" ]; then
exit
fi
case "${destFormat}" in
"7z") ${terminal} 7z a -mx=9 -m0=lzma2 "${destDir}/${destName}" "${@}";;
"rar") ${terminal} rar a -m5 "${destDir}/${destName}" "${@}";;
"tar") ${terminal} tar cfv "${destDir}/${destName}.tar" "${@}";;
"tar.bz2") ${terminal} tar cfv "${destDir}/${destName}.tar.bz2" "${@}" --bzip2;;
"tar.xz") ${terminal} tar cfv "${destDir}/${destName}.tar.xz" "${@}" --xz;;
"tar.lzma") ${terminal} tar cfv "${destDir}/${destName}.tar.lzma" "${@}" --lzma;;
"tar.lzip") ${terminal} tar cfv "${destDir}/${destName}.tar.lzip" "${@}" --lzip;;
"tar.lzop") ${terminal} tar cfv "${destDir}/${destName}.tar.lzop" "${@}" --lzop;;
"tar.gz") ${terminal} tar cfv "${destDir}/${destName}.tar.gz" "${@}" --gzip;;
esac
exit 0
Extraire ici
#!/bin/sh
terminal="roxterm --separate -e"
for src in "${@}"; do
case `file -b --mime-type "${src}"` in
# tar
"application/x-tar")
${terminal} tar xf "${src}" -v;;
# rar, zip, arj
"application/x-rar" | "application/zip" | "application/x-arj")
${terminal} 7z x "${src}";;
# bzip2
"application/x-bzip2")
${terminal} tar xjvf "${src}";;
# xz
"application/x-xz")
${terminal} tar xJvf "${src}";;
# gz
"application/x-gzip")
${terminal} tar xzvf "${src}";;
# ar
"application/x-archive")
${terminal} ar x "${src}";;
# lzma, lzop, 7z, cbr, jar, exe
"application/octet-stream")
if [ `(echo "${src}" | grep "lzma")` != "" ]; then
${terminal} tar xvf "${src}" --lzma
elif [ `(echo "${src}" | grep "lzop")` != "" ]; then
${terminal} tar xvf "${src}" --lzop
elif [ `(echo "${src}" | grep "[7z|cbr|jar|exe]")` != "" ]; then
${terminal} 7z x "${src}"
fi
esac
done
exit 0
Extraire vers :
#!/bin/sh
terminal="roxterm --separate -e"
destDir=`zenity --file-selection --directory --title="Dossier de destination"`
if [ "${destDir}" = "" ]; then
exit
fi
for src in "${@}"; do
case `file -b --mime-type "${src}"` in
# tar
"application/x-tar")
${terminal} tar xvf "${src}" -C "${destDir}";;
# rar, zip, arj
"application/x-rar" | "application/zip" | "application/x-arj")
${terminal} 7z x -o"${destDir}" "${src}";;
# bzip2
"application/x-bzip2")
${terminal} tar xjvf "${src}" -C "${destDir}";;
# xz
"application/x-xz")
${terminal} tar xJvf "${src}" -C "${destDir}";;
# gz
"application/x-gzip")
${terminal} tar xzvf "${src}" -C "${destDir}";;
# lzma, lzop, 7z, cbr, jar, exe
"application/octet-stream")
if [ `(echo "${src}" | grep "lzma")` != "" ]; then
${terminal} tar xvf "${src}" -C "${destDir}" --lzma
elif [ `(echo "${src}" | grep "lzop")` != "" ]; then
${terminal} tar xvf "${src}" -C "${destDir}" --lzop
elif [ `(echo "${src}" | grep "[7z|cbr|jar|exe]")` != "" ]; then
${terminal} 7z x -o"${destDir}" "${src}"
fi
esac
done
exit 0
Dernière modification par Tetsumaki (Le 19/11/2010, à 19:46)
Hors ligne