[script] recréer sa base RPM avec un script

recréer sa base RPM avec un script [script] - Linux et OS Alternatifs

Marsh Posté le 26-04-2002 à 20:05:25    

Salut tout le monde
 
bon, ça y est, je me suis lancé, j'ai utilisé le script qui est en dernier topic. et c'est fait, ma base RPM est complètement refaite (pour la plus grande partie en tout cas, je peux pas vérifier pour tout les paquetages ;) )
 
Je tiens à remercier nicotine et JBM pour leurs conseils avisés.
MERCI
 
Message original:
Bonjour,
 
Je cherche une commande shell (ou un soft, je suis pas à ça pres) pour lire une ligne donnée dans un fichier texte et me l'envoyer dans une variable.
 
Merci

 

[jfdsdjhfuetppo]--Message édité par Mjules le 29-04-2002 à 19:24:14--[/jfdsdjhfuetppo]


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 26-04-2002 à 20:05:25   

Reply

Marsh Posté le 26-04-2002 à 20:28:38    

tu peux detailler stp ?  
 
sinon  
 
toto=`grep machin truc.txt`

Reply

Marsh Posté le 26-04-2002 à 21:01:06    

en fait, je voudrais un truc qui permette de lire la n-ième  ligne d'un fichier texte et me la copier dans une variable
genre:
lire ligne1 mon_fichier > $variable
 
en fait, je cherche toujours à faire mon script pour refaire ma base des RPMS à partir de ceux de mon CD d'install et des fichiers présents sur mon dur.
 
pour l'instant, j'ai déjà (comme début de script) :

#!/bin/sh
 
#il faut etre dans le dossier ou il y a les RPMS
#liste les RPMS et écrit la liste dans /$HOME/listerpm
dir *.rpm > /$HOME/listerpm

là, j'arrive au point litigieux puisqu'il faut que je lise une ligne du fichier listerpm

num=1
while ligne $num de listrpm == 0 ; do  # jusqu'à ce que la   ligne n de listerpm soit vide  (chose que je ne sais pas écrire)
# je lis la n° ligne de listerpm et j'inscris sa valeur dans # le fichier RPM1
 
head -n $num /$HOME/listerpm | tail -1 >/$HOME/RPM1  
 
# je liste les fichiers de doc contenus dans le fichier RPM1
# et je les inscrit dans listfich
rpm -ql --docfiles -p "/$HOME/RPM1" >/$HOME/listfich
 
head -n 1 /$HOME/listfich>/$HOME/DOC1 # je lis la 1° ligne et je l'inscrit dans DOC1
 
if locate "DOC1"  # sauf que là, je sais pas l'écrire (parce que la commande là, elle marche pas :( )
then ajouter "/$HOME/RPM1" /$HOME/listinst # là, je veux écrire une ligne dans un fichier,à la suite des autres lignes et qui contient le texte de RPM1
 
fi
 
num=$[$num+1]
done
 
#maintenant je peux updater ma base avec les paquetages qui sont sur mon système
 
rpm -U --nodeps --justdb "/$HOME/listinst"
 

 
Voilà, c'est fini, peut tu me dire quelles améliorations je peux y apporter et quelles commandes il faut que je tapes pour :

  • trouver un fichier dont le nom complet (chemin+nom) est dans un autre fichier
  • tester si une ligne est vide ou non
  • inscrire une ligne dans un fichier


merci

 

[jfdsdjhfuetppo]--Message édité par Mjules le 26-04-2002 à 21:53:15--[/jfdsdjhfuetppo]


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 26-04-2002 à 21:13:56    

pourquoi vouloir lire un numero de ligne ?  
 
peut etre existe t il une autre maniere d'apprehender le probleme ?  
 
sinon  
 
num=10
head $num fichier | tail -1

 

[jfdsdjhfuetppo]--Message édité par nicotine le 26-04-2002 à 21:16:14--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 21:18:14    

plus precisement (testé)  
 
head -n $num <fichier> | tail -1

Reply

Marsh Posté le 26-04-2002 à 21:26:50    

nicotine a écrit a écrit :

pourquoi vouloir lire un numero de ligne ?  
 
peut etre existe t il une autre maniere d'apprehender le probleme ?  
 
sinon  
 
num=10
head $num fichier | tail -1  




 
Merci pour la réponse. J'écris mon script et dans 10 min je poste le pourquoi et le comment.


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 26-04-2002 à 21:57:35    

Bon je vais reposter le script pour qu'il soit un peu + lisible:
 

#!/bin/sh

 
#il faut etre dans le dossier ou il y a les RPMS
#liste les RPMS et écrit la liste dans /$HOME/listerpm

 
dir *.rpm > /$HOME/listerpm
 
num=1
 
while ligne $num de listrpm == 0 ; do  # jusqu'à ce que la   ligne n de listerpm soit vide  (chose que je ne sais pas écrire)
# je lis la n° ligne de listerpm et j'inscris sa valeur dans # le fichier RPM1

 
head -n $num /$HOME/listerpm | tail -1 >/$HOME/RPM1  
 
# je liste les fichiers de doc contenus dans le fichier RPM1
# et je les inscrit dans listfich

rpm -ql --docfiles -p "/$HOME/RPM1" >/$HOME/listfich
 
head -n 1 /$HOME/listfich>/$HOME/DOC1 # je lis la 1° ligne et je l'inscrit dans DOC1

 
if locate "DOC1"  # sauf que là, je sais pas l'écrire (parce que la commande là, elle marche pas   )
 
then ajouter "/$HOME/RPM1" /$HOME/listinst # là, je veux écrire une ligne dans un fichier,à la suite des autres lignes et qui contient le texte de RPM1
 
fi
num=$[$num+1]
done
 
#maintenant je peux updater ma base avec les paquetages qui sont sur mon système
 
rpm -U --nodeps --justdb "/$HOME/listinst"

 
Voilà, c'est fini, peut tu me dire quelles améliorations je peux y apporter et quelles commandes il faut que je tapes pour :

  • trouver un fichier dont le nom complet (chemin+nom) est dans un autre fichier
  • tester si une ligne est vide ou non
  • inscrire une ligne dans un fichier

merci


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 26-04-2002 à 22:41:37    

variable=`awk 'NR==numéro'`


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 27-04-2002 à 04:49:57    

Je ne comprends pas trop ce que tu cherches à faire dans ton script mais je peux te proposer quelques améliorations possibles :
 

  • Pour lister des fichiers, utilise plutôt ls à la place de dir, on n'est pas chez Microsoft et même si cette commande est présente sur ta distribution, elle ne l'est pas forcément sur tous les Unix ;)


  • Au lieu d'utiliser une boucle while avec un compteur, utilise plutôt une boucle for de la forme :  
Code :
  1. for ligne in `cat /$HOME/listerpm`
  2. do
  3. ...
  4. done


 
De cette manière, tu auras le contenu ligne par ligne du fichier listerpm dans $ligne à chaque passage dans la boucle.
 

  • A la place du locate..., utilise la commande find avec pour syntaxe :
Code :
  1. find / --name <nom fichier>

et si tu veux executer quelque chose si le fichier est trouvé, rajoute

Code :
  1. --exec commande \;


 

  • Enfin, pour rajouter une ligne à la suite d'un fichier, utilise tout simplement la redirection ">>" et tu peux utiliser la commande cat pour afficher le contenu d'un fichier.


Mais précise un peu plus ce que tu cherches à faire...

 

[jfdsdjhfuetppo]--Message édité par JBM le 27-04-2002 à 04:51:51--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 27-04-2002 à 13:14:03    

merci pour toutes ces réponses;
 
ce que je cherche à faire, c'est à recréer ma base de donnée des paquetages installés parce que elle a planté et j'ai été obligé d'en recréer une vide.
Comme j'avais pas envie d'updater la base à la main avec tous les paquetages des CD d'install, je me suis dit pourquoi pas essayer de faire un script qui ferait ça.
 
+ de détails là :
http://forum.hardware.fr/forum2.ph [...] p=1&trash=
 
NB: j'ai utiliser la commande DIR parce qu'elle ne met pas d'étoiles à la fin des noms de fichiers. et LOCATE parce que ça cherche bien + vite que FIND

 

[jfdsdjhfuetppo]--Message édité par Mjules le 27-04-2002 à 13:29:13--[/jfdsdjhfuetppo]


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 27-04-2002 à 13:14:03   

Reply

Marsh Posté le 27-04-2002 à 13:23:37    

Voilà le script un peu amélioré:
 

#!/bin/sh

 
#il faut etre dans le dossier ou il y a les RPMS
#liste les RPMS et écrit la liste dans /$HOME/listerpm

 
dir *.rpm > /$HOME/listerpm
 
for ligne in `cat /$HOME/listerpm` ; do  # jusqu'à la dernière ligne de listerpm
[g]# je liste les fichiers de doc contenus dans la variable ligne et je les inscrit dans listfich

rpm -ql --docfiles -p "$ligne" >/$HOME/listfich
 
head -n 1 /$HOME/listfich>/$HOME/DOC1 # je lis la 1° ligne et je l'inscrit dans DOC1

 
if locate `cat DOC1`
 
then echo "$ligne" >>/$HOME/listinst # là, je veux écrire une ligne dans un fichier,à la suite des autres lignes et qui contient le texte de $ligne
fi
done
 
#maintenant je peux updater ma base avec les paquetages qui sont sur mon système
 
rpm -U --nodeps --justdb "/$HOME/listinst"

 

[jfdsdjhfuetppo]--Message édité par Mjules le 28-04-2002 à 21:20:00--[/jfdsdjhfuetppo]


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 29-04-2002 à 15:59:49    

:bounce:
 
Les questions sont toujoutrs valable, est ce que vous voyez qql chose à améliorer ?


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Marsh Posté le 29-04-2002 à 18:57:15    

pour ceux que ça intéresse, voilà le script que j'ai utilisé :
 
#!/bin/sh
 
dir *.rpm >/$HOME/listerpm
 
for ligne in `cat /$HOME/listerpm`; do
 rpm -ql --docfiles -p "$ligne" >/$HOME/listfich
 if test -s /$HOME/listfich
  then
   if locate `head -n 1 /$HOME/listfich`
    then echo "$ligne" >>/$HOME/listinst
   fi
  else rpm -ql -p "$ligne" >/$HOME/listfich
   if locate `head -n 1 /$HOME/listfich`
    then echo "$ligne" >>/$HOME/listinst
   fi
 fi
done
 
 
comme ça, je loupe le minimum de paquetages.
 
et ensuite, j'utilise la commande  
rpm -i --nodeps --justdb "/$HOME/listinst"


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed