Gambas France BETA


Pas de compte ? Incription

dpkg et gambas...

Ce sujet est résolu.

1
AuteurMessages
didier18#1 Posté le 26/7/2015 à 11:17:09
Bonjour
Je souhaite 'décompacter' des paquets .deb (nombre et nom de paquets inconnu) sans les installer.
J'ai trouvé cette commande 'terminal' qui fonctionne à peu près, je me place dans le répertoire ou sont les paquets .deb et je tape la formule :
for i in *.deb; do dpkg-deb -x $i extraction; done
Le répertoire extraction est créé et les paquets sont 'décompactés à l'intérieur (sauf les liens sybolique -Pourquoi ?-)
Cette même commande placée dans dans un shell ne fonctionne pas :
Shell ("for i in *.deb; do dpkg-deb -x $i extraction; done") Wait
Cette formule me renvoi dans la console :
dpkg-deb: error: failed to read archive `*.deb': No such file or directory

Le fait que 'extraction' soit inscrit en dur ne change rien, j'ai essayé de passer par une variable $extract et le résultat est le même.
Shell ("for i in " & $Pathdef & "/" & nomrep & "/ *.deb; do dpkg-deb -x $i " & $extract & "; done") Wait
Cette formule me renvoi dans la console :
dpkg-deb: error: error reading archive magic version number from file /root/crearchcompress/testdeb/: Is a directory
dpkg-deb: error: failed to read archive `*.deb': No such file or directory

Quelle est la 'bonne' formule magique ?
Merci.
Flachy Joe#2 Posté le 26/7/2015 à 13:18:19
Iguane : Il Gambas Uniquement pour Activer ses NEuronesUne règle de base du shell : si tu utilises une boucle c'est que tu as loupé quelque chose ;-)
Proposition :
1
SHELL ("find " & $Pathdef & " -name '*.deb' -exec dpkg-deb -x {} " & $extract & "\;")
;) Flachy Joe ;)
Reivillo#3 Posté le 26/7/2015 à 13:20:19
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Bonjour didier18, Flachy Joe & Autres.

Une piste ICI, peut-être!

Reivillo.

Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
didier18#4 Posté le 27/7/2015 à 01:17:35
Merci pour vos réponses et aide.
Flachy Joe, mon incompétence en matière de commandes à exécuter dans un terminal n'est plus à prouver...
Des choses, j'ai surement du en louper plein, mais je ne demande qu'à apprendre...
Pourquoi est-ce déconseillé (ou interdit ?) d'utiliser une boucle dans du shell ?
Shell n'est-il pas là pour emuler un terminal ?

Telle que, ta formule me renvoi le message : "Constante de caractère incorrecte au sein de la chaîne dans Fmain.class 656"
Le curseur étant positionné en fin de ligne, j'ai supprimé le "\" et laissé le " ;".
Malgré tout comme je l'indique en début de fil, je part du principe que je ne connais pas le nombre de fichiers (ni leur nom) à décompacter.
Donc une boucle ou un "tant que..." me paraît indispensable à placer à un endroit ou un autre.
Si je place ce code, les 3 paquets sont bien lus et affichés dans la console, mais pas d'extraction du $Fich en cours dans $extract.

1
2
3
4
5
6
PRINT "Chemin ou se trouvent les .deb = " & $Pathdef & "/" & nomrep
PRINT "Repertoire de 'décompactage' = " $extract
FOR EACH $Fich IN Dir($Pathdef & "/" & nomrep, "*.deb")
SHELL ("find " & $Pathdef & "/" & nomrep & " -name '*.deb' -exec dpkg-deb -x " & $Fich & " " & $extract & " ;")
PRINT $Fich
NEXT


Et j'ai les messages suivants dans la console :

Chemin ou se trouvent les .deb = /root/crearchcompress/testdeb
Repertoire de 'décompactage' = extraction
find: missing argument to `-exec'
gambas3-gb-complex_3.7.0-24.33~ubuntu14.04.1_i386.deb
find: missing argument to `-exec'
gambas3-gb-cairo_3.7.0-24.33~ubuntu14.04.1_i386.deb
find: missing argument to `-exec'
gambas3_3.7.0-24.33~ubuntu14.04.1_all.deb
find: missing argument to `-exec'

Donc j'ai encore du louper un truc quelque par :-(

Je me suis inspiré de http://ubunteros.tuxfamily.org/spip.php?article172 ou il est précisé : "-exec commande ; : Exécute la commande. Tous les arguments de find sont considérés comme des arguments pour la ligne de commande, jusqu’à ce qu’on rencontre un " ;". La chaîne "{}" est remplacée par le nom du fichier en cours de traitement, et ceci dans toutes ses occurrences. Ces deux chaînes peuvent avoir besoin d’être protégées du développement de la ligne de commande par le shell, en utilisant le caractère d’échappement ("\") ou une protection par des apostrophes. La commande est exécutée depuis le répertoire de départ."

Reivillo, j'avais déjà (un peu) regardé du coté de dpkg-divert, mais il me semble que cette commande ne déplace pas les répertoires. Je vais tout de même y regarder de plus près car ce serai une solution pour le problème des liens symbolique (probablement qu'il faut d'abord décompacter puis ensuite recréer les liens -ce qui me paraît logique-).


Flachy Joe#5 Posté le 27/7/2015 à 12:12:25
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut,
concernant les boucles, c'est juste qu'il y a tellement d'outils plus efficaces disponibles qu'on arrive quasiment toujours à se passer d'elles, dans un appel Shell aussi bien que dans le terminal.

L'antislash est nécessaire pour que le point virgule soit passé dans les argument de find (ça marque la fin de la commande à passer à exec) et non interprété par le shell.
Le souci ici c'est que c'est interprété par Gambas, il faut donc doubler l'antislash :
1
SHELL ("find " & $Pathdef & " -name '*.deb' -exec dpkg-deb -x {} " & $extract & "\\;")


find s'occupe de lancer la commande suivant exec pour chaque fichier trouvé, en remplaçant {} par le nom du fichier, il n'y a donc pas besoin de boucle, ni en Gambas, ni en Bash.

EDIT : pour suivre les liens symboliques, utilise l'option -L de find :

1
SHELL ("find -L " & $Pathdef & " -name '*.deb' -exec dpkg-deb -x {} " & $extract & "\\;")
;) Flachy Joe ;)
didier18#6 Posté le 28/7/2015 à 01:15:39
Bonsoir
Merci Flachy Joe pour toutes ces précisions.
En essayant le 2 lignes de code,je n'ai plus l'erreur "Constante de caractère incorrecte au sein de la chaîne dans Fmain.class 656", mais j'ai tout de même l'erreur "find: missing argument to `-exec'".
Ceci dit, j'ai reçu en parallèle la réponse à ma question initiale.
Voici le code si cela peut aider d'autres personnes qui ont le même souci...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
PUBLIC Content AS STRING


PUBLIC SUB Main()

DIM ProcessShell AS Process
DIM DirExtract AS STRING
DIM FichierSource AS STRING

FichierSource = "/tmp/deb/*.deb"
DirExtract = "/tmp/extract"
Content = ""

IF NOT Exist(DirExtract) THEN
TRY MKDIR DirExtract
ENDIF

PRINT "Debut de l'extraction..."

ProcessShell = SHELL "for D in " & FichierSource & "; do echo \"Fichier: $D\" ; dpkg-deb -x $D '" & DirExtract & "' ; done ;" FOR READ AS "InfoCopy"

WAIT 50000


END

PUBLIC SUB InfoCopy_Read()

DIM sLine AS STRING

READ #LAST, sLine, -256

Content = Content & sLine
PRINT sLine;

END


Avec quelques aménagements mineurs, cela correspond exactement à ce que je voulais obtenir.
Même le problème des liens symboliques est solutionné.
Merci Flachy Joe, Reivillo et Linuxos qui est l'auteur de ce code.
1