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 08/02/2014, à 14:22

L'Africain

Ajouter une même ligne dans plusieurs fichiers (résolu)

Bonjour,
Voilà mon problème. J'ai décidé de télécharger tous les pilotes brother tant que j'ai une bonne connexion, pour me créer ensuite un dépôt personnel que je peux embarquer là où il n'y a pas internet et installer toutes les brothers que je veux... (Il y en a de plus en plus ici).
Mais bon voilà les fichier control des .deb fournis pas brother ne sont pas acceptés par reprepro, parce qu'il manque la ligne "section" dans certains fichiers.
Donc je voudrais ajouter cette ligne :
"section: Brother"
Dans tous les fichiers control des .deb en cause.

Est-il possible de le faire en une fois et pas devoir décompresser tous les deb un après l'autres pour modifier le fichier control?

Enfin je dois aussi modifier le nom des fichiers en mettant les majuscules en minuscules. (Mais ça c'est possible de passer outre, cependant j'en profite pour vous demander)

Merci d'avance

Dernière modification par L'Africain (Le 14/02/2014, à 12:43)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 09/02/2014, à 14:37

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

salut,
tu as regarder

sed -i <Numéro_de_la_ligne>,"section: Brother" <nom_du_fichier_qui_pose_problème> 

pour modifier tout les fichiers tu fais une boucle for ..

for i in *.deb #par exemple

bon pour mettre les noms de majuscule en minuscule dans ta boucle

<NOM_DU_FICHIER>| tr [A-Z] [a-z] #bon là google te l'aurais dit mieux que moi en moins de temps :D

il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#3 Le 09/02/2014, à 14:57

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Merci !
Je vais essayer ça, je dirais quoi  dans quelques jours. Pour google comme j'y connais strictement rien en ce domaine, je savais même pas les mots que je devais utiliser pour la recherche...


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 09/02/2014, à 20:36

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Ça marche pas :

sed -i 5 "section : brother\n" control for i in *.deb

donne ça :

sed: -e expression n°1, caractère 1: commande manquante

Si je teste seulement avec un fichier control sans "for i in *.deb", même résultat, j'ai aussi tenté avec la virgule après le nom de la ligne.

Dernière modification par L'Africain (Le 09/02/2014, à 20:45)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#5 Le 10/02/2014, à 01:54

Postmortem

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Salut,
Pour ajouter ta ligne, par exemple, entre la 4ème et la 5eme :

sed -i '5i"section: Brother"' fichier

Ça ajoute la ligne entre guillemets, je ne sais pas si tu les veux dans ton fichier ou pas. Il suffit de les enlever de la commande s'il n'y en a pas besoin.
Par contre, ça m'étonnerait que tu puisses agir directement sur les .deb, je pense qu'il faut extraire les fichiers qu'ils contiennent, faire les modifs dont tu as besoin puis reconstruire le .deb.
Pour ça, je ne peux pas t'aider.
Pour boucler sur les .deb :

for fic in *.deb
do
   # Mettre ici les commandes pour extraire le .deb
   # qui est nommé "$fic" entre do et done.
   # Puis faire tes modifs
   # Puis reconstruire le .deb
done

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 10/02/2014, à 12:04

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Ok merci je regarde ça. La commande pour créer le deb, c'est ok mais celle pour l'extraire???


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#7 Le 10/02/2014, à 20:25

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

bonjour,
Pour modifier un fichier c'est ok avec :

sed -i '5i"section: Brother"' fichier

Mais si j'ajoute :for fic in *.deb, ce qui donne :

sed -i '5iSection: Brother' control for fic in *.deb

J'ai cette erreur :

sed: impossible de lire for: Aucun fichier ou dossier de ce type
sed: impossible de lire fic: Aucun fichier ou dossier de ce type

Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#8 Le 10/02/2014, à 20:40

Postmortem

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Ta syntaxe n'est pas bonne du tout.
On fait comme ça :

for fic in *.deb
do
   # extraction du contenu du deb ("$fic" dans la boucle)
   sed -i '5i"section: Brother"' chemin/du/fichier
   # reconstruction du .deb
done

Mais ça m'étonnerait que ça fonctionne si tu fais le sed direct sur un fichier .deb.
Il faudrait déjà réussir à le faire pour un fichier, pour le faire sur tous, ça sera pas compliqué.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 10/02/2014, à 20:42

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

non le sed du dois l'employer dans ta boucle (exemple juste pour te montrer la structure ensuite à toi d'adapter à ton besoin)

for i in *. deb           # la variable i prendra tout les noms des fichiers deb du répertoire (c'est le début de ta boucle)
do
 <instruction 1>
 <instruction 2>
 sed -i '5i'"section: Brother"' $i        #$i représente ton fichier deb 
 <instruction>
done 

il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#10 Le 11/02/2014, à 14:38

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Voilà ou j'en suis, en faisant d'abord une commande après l'autre avec un .deb dans ce même dossier ça marche :

dpkg-deb -x *.deb ./
dpkg-deb -e *.deb
sed -i '5iSection: Brother' DEBIAN/control
dpkg-deb -b ./ *.deb

Maintenant le seul problème c'est que dans le deb final il y a aussi compréssé l'ancien deb...
J'ai les dossier normaux, DEBIAN, usr, var, et le deb en question.
ALors pour améliore le script, je devrais encore créer un dossier qui porte le nom du deb au préalable. Je fais comment?


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#11 Le 11/02/2014, à 14:48

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

il  suffit pas de le supprimer l'ancien deb par un simple

rm

avant de recompiler tes deb?


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#12 Le 12/02/2014, à 14:11

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Bon c'est déjà pas mal, un simple rm, peut-être mais avant il faudrait, qu'avant d'extraire, le script créer un dossier du même nom que le deb sans l'extension,

for i in *. deb           
do
<commande pour créer un dossier qui portera le nom du deb traité>
mkdir nom_du_dossier_créé_lors_de_la_première_commande/DEBIAN
dpkg-deb -x *.deb ./
dpkg-deb -e *.deb nom_créé_lors_de_la_première_commande/DEBIAN
sed -i '5iSection: Brother' DEBIAN/control
dpkg-deb -b <nom_créé_lors_de_la_première_commande/ 
rm <dossier créé première commande>
done

J'avais oublié de vous demande si on peut pas ajouter un truc du genre "if", au cas où dans le dossier control il y a déjà la ligne 'Section :Brother"? Il y aussi peut-être un $i à mettre quelque part... Je ne comprends pas bien sa signification.

Merci déjà pour votre aide !


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#13 Le 12/02/2014, à 17:31

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

alors i c'est le nom de ta variable tu pourrais l’appeler toto ou tata
  $i c'est quand on accole le caractère spécial $ et le nom de la variable i, $i signifie au bash de prendre le contenu de la variable i. $toto signifierai de prendre le contenu de la variable toto.
rm -rf <nom_dossier>   #utilise -r pour les sous dossiers


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#14 Le 13/02/2014, à 14:33

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Ok merci, pour le rm je comprend, ce que je sais pas faire, c'est l'instruction qui va créer le dossier qui va porter le nom du .deb qui va être traité, et qui sera à chaque fois différent. Après si j'ai la commande pour le créer je met la même pour le supprimer :
mkdir $i ça peux marcher ? Faut encore le ".deb" en moins
Si je fais ça :
mkdir $i *.deb
J'ai ça :
mkdir: impossible de créer le répertoire «dcp7055lpr-2.1.0-1.i386.deb»: Le fichier existe


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#15 Le 13/02/2014, à 20:46

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

imaginons une nouvelle variable j

j=$(cut -d'.' -f1 <<<$i)

sachant que $i contiendra le nom de ton fichier (exemple $i=dcp7055lpr-2.1.0-1.i386.deb)
après tu peux faire

mkdir $j 
rmdir -rf $j

cut c'est pour couper une chaine de caractère ou tu précises le caractère de séparation (ici le point décimal) et le champs que tu veux (ici le premier qui correspond au nom sans le .deb)
après si tu veux explorer plus à fond tu as man cut et internet wink. Bien sûr il existe d'autre méthode (awk ou du bash pur...)


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#16 Le 14/02/2014, à 02:41

Postmortem

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Salut,
J'ai pas testé mais si j'ai bien compris le man et ta demande :

for i in *.deb
do
   nom=${i%.deb}
   dpkg-deb -x "$i" "$nom" # Normalement ça créé le répertoire sans .deb et ça fait l'extraction
   dpkg-deb -e "$i" "$nom/DEBIAN"
   if ! grep -q 'Section: Brother' "$nom/DEBIAN/control" # Si la ligne est absente, on la rajoute et on recréé le package
   then
      sed -i '5iSection: Brother' "$nom/DEBIAN/control"
      dpkg-deb -b "$nom" "$i" # Normalement, ça écrase le package déjà présent
   fi
   rm -r "$nom" # Suppression du répertoire
done

Il faut se placer dans le répertoire contenant les .deb avant d'exécuter.
Et faire du ménage si tu as des répertoires correspondant aux noms des .deb (autant travailler sur un repertoire ne contenant que tes packages)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#17 Le 14/02/2014, à 11:31

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Vous êtes des as, j'essaye ça dès que possible, merci pour votre patience, juste une question, dans le script, je mets tel qeul "nom" ou je dois préciser un truc? ok pour les infos sur les répertoires, j'avais bien ça à l'esprit !


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#18 Le 14/02/2014, à 12:38

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Ça marche ok un grand merci à vous!! Je mets résolu.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#19 Le 16/02/2014, à 21:22

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Excusez moi de revenir encore, je croyais que j'allais finalement m'en tirer seul pour les majuscules, mais je m'en sort pas ! Donc j'arrive à substituer toutes les majuscules d'un fichier grâce à tr :

tr -s [A-Z] [a-z] <control | sponge control

ou bien seulement à la première ligne avec sed si je définis quelles lettres :

sed -e '1 s/DCP/dcp/' '1 s/HL/hl/' control | sponge control

Le problème c'est que je ne veux pas supprimer toutes les majuscules, mais seulement celle de la première ligne qui pourraient se trouver après la mot : "Package: " Et ce n'est pas toujours les même majuscules...

Merci d'avance, désolé pour le résolu un peu rapide...


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#20 Le 16/02/2014, à 21:49

Spirale21

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

eh bien avec sed tu peux dire que l'éditeur commence à partir du motif Package: et finissent là où tu veux (numéro de ligne fin de fichier, autre motif ...)

sed -e '/Package :/,<adresse_fin> s/DCP/dcp/<flag ou numéro d’occurrence>' -e ........

Ce n'est pas toujours les mêmes lettres.... tu peux préciser? il y a une liste, il y a un endroit précis, ça forme un mot particulier? Il y a un motif particulier (une suite de lettre particulière) ?


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#21 Le 17/02/2014, à 08:54

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Bonjour spirale,
voilà ce qu'il peut y avoir : DCP-xxxC, DCP-xxxCN, DCP-xxxCW, DCP-xxxxD, DCP-xxxxDN, DCP-9045CDN, HL, HL-1870N,HL-2170W, HL-2270DN, HL-2270DW, HL-3040CN, HL-4040CDN, HL-4070CDW,HL-4570CDWT, MFC-210C, MFC-255CW, MFC-295CN, PT,QL, PJ . Les chiffres j'ai pris au hasard ça en fait pas mal, si j'en ai pas oublié.
Par contre il y a un endroit très précis, c'est à la première ligne après le mot "Package: cupswrapper...."


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#22 Le 17/02/2014, à 09:56

Postmortem

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Salut,
La partie  "Package: cupswrapper....", elle est en 1ère position sur la ligne ou pas ?
S'il y a quelque chose avant, c'est toujours la même chose ou pas ?
Le mieux serait que tu nous mettes un ou 2 exemples de cette fameuse 1ère ligne ainsi que le résultat attendu.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#23 Le 17/02/2014, à 10:07

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Par exemple :
Package: cupswrapperDCP1000
Doit donner ça :
Package: cupswrapperdcp1000
Ou ça :
Package: cupswrapperDCP310CN
donner ça :
Package: cupswrapperdcp310cn
Oui "Package:" est bien le début du fichier et donc de la première ligne.
Il n'y a pas moyen d'utiliser tr seulement sur une partie de la la première ligne?


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#24 Le 17/02/2014, à 10:22

pingouinux

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

Bonjour,

L'Africail #23 a écrit :

Oui "Package:" est bien le début du fichier et donc de la première ligne.
Il n'y a pas moyen d'utiliser tr seulement sur une partie de la la première ligne?

Tu peux faire ceci

awk '{if(NR==1 &&/^Package:/) {print $1" "tolower($2)} else print}' fichier

Hors ligne

#25 Le 17/02/2014, à 10:27

L'Africain

Re : Ajouter une même ligne dans plusieurs fichiers (résolu)

ok j'essaye.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne