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 29/05/2011, à 17:26

argolance

[RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Bonjour,
Je souhaite passer en revue le contenu de certains fichiers texte d'un répertoire et dans chacun de ces fichiers, identifier la  ligne contenant la chaine "Name", la récupérer puis l'assigner à une variable "NAME":

VARIABLE=(`find /usr/local/dossier -name '*.xxx'`)
   for FILE in ${VARIABLE[@]}; do 
NAME=$(grep Name $FILE)
...
done

Mon problème: Il se trouve que cette ligne n'existe pas dans tous les fichiers concernés (*.xxx).
Deux solutions:
- Connaitre la commande qui me permettrait d'ajouter une ligne par défaut dans chacun des fichiers si elle n'est pas présente...
- Ou alors, assigner une valeur par défaut à la variable "NAME" si la ligne n'existe pas et que la valeur renvoyée est nulle.

Je ne suis pas un spécialiste et je ne suis pas sûr d'être assez clair pour me faire comprendre?
Quelqu'un a-t-il une idée?
Merci!

Cordialement.

Dernière modification par argolance (Le 30/05/2011, à 09:57)

Hors ligne

#2 Le 29/05/2011, à 17:52

amwus

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Si je comprend bien, tu veux rechercher la ligne contenant la chaîne "Name" dans tous tes fichiers et assigner la ligne (ou ce qu'il y a après un "=" comme "Name=" ?) à une nouvelle variable NAME.

Je pense qu'avec un script Python, tu peux t'en sortir assez facilement. Une solution simple, quoi que pas très efficace, serait de parcourir l'ensemble des fichiers (très simple en Python), et pour chaque ligne de chaque fichier, tu recherche la chaîne "Name" (très simple en python aussi). Une fois la ligne identifiée, tu peux analyser plus en détail cette dernière pour extraire les informations que tu désires.

Si un fichier ne contient pas cette chaîne, tu peux renvoyer une valeur d'erreur et assigner une valeur par défaut à ta nouvelle variable...

Je ne sais pas si ça t'aide beaucoup. Tu codes en quoi ? Bash uniquement ?


Black holes are where god divided by zero...

Hors ligne

#3 Le 29/05/2011, à 18:32

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Merci amwus pour ta réponse rapide!

Tu codes en quoi ? Bash uniquement ?

... gtkdialog3 (Puppy/Toutou LINUX!), et je n'y connais absolument rien en Python et ne sais même pas si ça peut "tourner" avec (sans doute!)!

Si je comprend bien, tu veux rechercher la ligne contenant la chaîne "Name" dans tous tes fichiers et assigner la ligne (ou ce qu'il y a après un "=" comme "Name=" ?) à une nouvelle variable NAME.

... Tu as bien compris!

Si un fichier ne contient pas cette chaîne, tu peux renvoyer une valeur d'erreur et assigner une valeur par défaut à ta nouvelle variable...

Ben oui, c'est ça (ou bien la valeur d'une autre variable déclarée), mais c'est justement ça que je ne sais pas comment formuler en ligne de commande à l'intérieur de for... in...; do ...done pour que cela soit appliqué à tous les fichiers! J'ai essayé en y introduisant  if... ; then... fi, mais ça coince dur!
Voici le type de fichier à traiter...

[Desktop Entry]
Encoding=UTF-8
Name=Pburn CD-DVD-Blu-ray writer
Name[fr]=Gravage de CD-DVD-Blu-ray
Name[hu_HU]=Pburn CD-DVD-Blu-ray író
Name[ja]=Pburn CD-DVD-Blu-ray書き込み
Icon=/usr/share/pixmaps/pburn.png
Comment=Logiciel de gravage de CD/DVD/Blu-ray
Exec=pburn
Terminal=false
Type=Application
Categories=DiskBurning
GenericName=Pburn CD-DVD-Blu-ray writer

Merci encore de ton aide!

Cordialement!

Hors ligne

#4 Le 29/05/2011, à 18:59

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

VARIABLE=(`find /usr/local/dossier -name '*.xxx'`)
   for FILE in ${VARIABLE[@]}; do 
NAME=$(grep Name $FILE)
: ${NAME:="Fallback string"}

Ceci dit on ne fait jamais un for sur un find pour traiter des fichiers donc plutôt :

for FILE in /usr/local/dossier/*.xxx; do
    unset NAME
    NAME=$(grep -- Name $FILE)
    : ${NAME:="Fallback string"}
    # Other actions
done

Dernière modification par FRUiT (Le 30/05/2011, à 05:13)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#5 Le 29/05/2011, à 19:50

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Hello,
Merci!

FRUiT a écrit :

Ceci dit on ne fait jamais un for sur un find pour traiter des fichiers

Désolé! Pour bricoler mes scripts, j'apprends petit à petit en m'inspirant en partie de ce que je trouve dans d'autres scripts existants que j'adapte à mes besoins. Si le script source "fonctionne", j'avoue ne pas lui en demander plus...
Cela dit, et si ce n'est pas trop abuser, est-il possible d'avoir quelques précisions sur ce à quoi correspond:

: ${NAME:="Fallback string"}

"Fallback string"? roll ... Je me coucherai un peu moins sot ce soir!

 # Other actions

... les actions en question peuvent-elles être du type "if" et compagnie?

Cordialement.

Dernière modification par argolance (Le 29/05/2011, à 20:00)

Hors ligne

#6 Le 30/05/2011, à 01:30

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

argolance a écrit :
 # Other actions

... les actions en question peuvent-elles être du type "if" et compagnie?

Ben, ensuite tu traites la variable NAME comme tu veux, je suppose que ton script continue après ton bout en exemple. Dans une boucle for on peut en effet mettre des if des while, même imbriquer plusieurs autres boucles for, enfin tout ce qui peut être écrit dans un script.


argolance a écrit :

Cela dit, et si ce n'est pas trop abuser, est-il possible d'avoir quelques précisions sur ce à quoi correspond:

: ${NAME:="Fallback string"}

"Fallback string"? roll ... Je me coucherai un peu moins sot ce soir!

Cette formulation particulière teste la variable NAME. Si celle ci est vide ou non déclarée, alors il lui sera assigné la valeur entre les guillemets. « Fallback string » c'est juste un exemple, à toi d'assigner ce que tu veux à cette variable en cas de nullité.

Exemple :

> unset NAME
> echo $NAME

> : ${NAME:="String de la mort qui tue des ours"}
> echo $NAME
String de la mort qui tue des ours
> : ${NAME:="Foo bar"}
> echo $NAME
String de la mort qui tue des ours
>
> unset NAME
> echo $NAME

> : ${NAME:="$(date)"}
> echo $NAME
Mon, 30 May 2011 01:30:01 +0200
>

Dernière modification par FRUiT (Le 30/05/2011, à 05:06)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#7 Le 30/05/2011, à 09:56

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Merci pour toutes ces précisions...
(Ai jeté un œil à ton lien perso et j'avoue être impressionné par le thème Neon Plasma qui est vraiment très très beau! Bravo!)

Bonne continuation!

Hors ligne

#8 Le 30/05/2011, à 10:38

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Ah bah merci sympa ^^

Et de rian smile


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#9 Le 30/05/2011, à 12:18

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Hello,
Denière petite précision:

:for FILE in /usr/local/dossier/*.xxx; do
    unset NAME
    NAME=$(grep -- Name $FILE)
    : ${NAME:="Fallback string"}
    # Other actions
done

Quelle est l'utilité et la signification de  "--"   dans 

NAME=$(grep -- Name $FILE)

Merci!
Cordialement.

Hors ligne

#10 Le 30/05/2011, à 12:35

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Euh là en l'occurrence rien ^^ J'ai confondu avec la variable NAME.

En fait lorsque l'on fait un grep avec une variable comme motif (exemple grep $NAME $FILE), il se peut que ce motif variable commence par -, auquel cas grep pense qu'il s'agit d'une option et non le motif recherché. L'option spéciale -- signifie explicitement que les options sont terminées, et que l'argument suivant est bien le motif à rechercher (et donc ce motif peut éventuellement commencer par - sans faire bugger la ligne de commande).

Là comme tu ne cherches qu'un texte prédéfini 'Name', ça n'a pas d'importance tu peux ne pas le mettre.

Dernière modification par FRUiT (Le 30/05/2011, à 12:37)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#11 Le 30/05/2011, à 17:17

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Hello!
Désolé de revenir à la charge...

argolance... a écrit :

Deux solutions:
- Connaitre la commande qui me permettrait d'ajouter une ligne par défaut dans chacun des fichiers si elle n'est pas présente...
- Ou alors, assigner une valeur par défaut à la variable "NAME" si la ligne n'existe pas et que la valeur renvoyée est nulle.

J'ai la réponse à la deuxième solution (grand merci!), pas à la première, qui me serait elle aussi bien utile... Et comme c'est l'objet annoncé de ce fil, du coup, il serait vraiment [RESOLU] et peut-être utile aux autres utilisateurs de ce Forum!

Merci!

Dernière modification par argolance (Le 30/05/2011, à 17:19)

Hors ligne

#12 Le 30/05/2011, à 17:57

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

grep -q Name "$FILE" || echo "Name=foo bar" >>"$FILE"

Dernière modification par FRUiT (Le 30/05/2011, à 18:03)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#13 Le 30/05/2011, à 19:56

argolance

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

Hello FRUiT,
Tout est maintenant juste et parfait!
Merci pour ta patience et ta réactivité!

Cordialement.

Hors ligne

#14 Le 30/05/2011, à 20:58

FRUiT

Re : [RESOLU] Ajouter ligne dans tous les fichiers d'un dossier.

De rian bonne continuation ^^


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne