Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/11/2010, à 04: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.
capturequevoulezvousfai.png

Ce qu'on veut compresser.
capturezenity.png

Répertoire de destination.
capturezenity1.png

Nom de l'archive.
captureajoutezunenouvel.png

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, à 07:30)

Hors ligne

#2 Le 18/11/2010, à 05: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, à 05: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, à 14: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, à 17: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, à 17:36)

Hors ligne

#5 Le 18/11/2010, à 17: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, à 17:39

chopinhauer

Re : Besoin d'aide, création d'un script de compression/décompression

Tetsumaki a écrit :

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, à 17: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 smile)
Et encore un autre merci lol

Hors ligne

#8 Le 18/11/2010, à 18: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, à 18: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, à 19:37

Tetsumaki

Re : Besoin d'aide, création d'un script de compression/décompression

Ok merci.

Hors ligne

#11 Le 19/11/2010, à 07: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 smile

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, à 07:34)

Hors ligne

#12 Le 19/11/2010, à 17: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, à 17:50

Tetsumaki

Re : Besoin d'aide, création d'un script de compression/décompression

chopinhauer a écrit :

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 smile

Hors ligne

#14 Le 19/11/2010, à 18: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, à 18:39)

Hors ligne

#15 Le 19/11/2010, à 18: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, à 18: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, à 20: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, à 20:46)

Hors ligne