Partage
  • Partager sur Facebook
  • Partager sur Twitter

script shell recherche

Sujet résolu
15 juillet 2010 à 0:31:35

Bonsoir,

Je vous explique l'interet de mon script, voila j'ai pas mal de cours dans mon dossier ils sont écrit avec plein de caractére majuscule minusule etc.. puis le mot clef correspondant au cours

par exemple j'ai :

gghHHkhIOUkkjkKL_Cours_De_Francais.pdf
uIUIUiJInnbVFsdFX_MathS_equation.pdf


Mon shell me permettrai de visionner le cours rechercher par pdf en entrant seulement le mot clef mais il y a probléme auquel je n'ai vraiment aucune idée ..


#! /bin/sh

echo -n "Entrer le mot clef se trouvant dans le cours recherché:"
read mot


`cd /home/boublil/cours`
$search=`ls|grep -i "$mot"`

# Si la commande retourne aucun resultat cad vide
if [ -z $search ]
then
echo Aucun cours contenant le mot $mot
exit 1
fi

#Si la commande affiche plus de 2 résultat
if [ $search -gt 2 ]
then
echo Il y a plusieurs fichier contenant le mot $mot:
echo $search
exit 1
fi

#Sinon c'est bon et on affiche le resultat obtenue dans l'application xpdf
else
`xpdf $search`  #Le probléme est qu'il n'affiche pas le resultat du grep donc il n'a pas le fichier en question et ne peut pas l'ouvrir comment peut-on y remedier 
fi


Erreur

/cours# ./look.sh

Entrer le mot clef se trouvant dans le cours recherché:roman
./look.sh: 8: =heyfghsy86654-azvvfdfse_Roman_PierreETjeaN.pdf: not found
Aucun cours contenant le mot roman



;)
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 3:25:13

Bonsoir Boubz

Il y a quelques petites erreurs.
1) Ligne 8 : il faut enlever le symbole dollar, c'est ce qui te donne l'erreur.
2) Ligne 11 : mettre des guillemets autour de $search, sinon ça plante quand il y a plusieurs fichiers trouvés.
3) Ligne 18 : tu compares un chaîne de caractères avec un nombre, normalement, c'est le nombre de fichiers trouvés que tu dois comparer au nombre. De plus -gt, c'est pour supérieur strict, donc le cas où 2 fichiers sont trouvés ne serait pas traité.
4) Ligne 23 : le fi est de trop.
5) Ligne 27 : les accents graves sont de trop. Et le mieux est de terminer par &, ça évitera d'avoir à faire un Ctrl + Z puis bg quand le document sera ouvert.

Tu peux donc écrire ceci :

#!/bin/sh

echo -n "Entrer le mot clef se trouvant dans le cours recherché : "
read mot

cd /home/boublil/cours
search=`ls | grep -i $mot`

# Si la commande ne retourne aucun résultat, càd vide
if [ -z "$search" ]
then
echo Aucun cours contenant le mot $mot
exit 1
fi

#Nombre de fichiers trouvés, on suppose qu'il n'y a pas de
#fichiers avec espace et on compte le nombre de mot dans search
nfiles=`echo $search | wc -w`

#Pour avoir le nombre sans les caractères blancs de début,
#on évalue une expression qui ne fait tout simplement RIEN
nfiles=`expr $nfiles`

#Remarque : On peut remplacer la condition de test "aucun résultat"
#en utilisant nfiles qui est égal à 0 en ce cas.

#S'il y a plus de deux résultats
if [ $nfiles -gt 1 ]
then
echo Il y a plusieurs fichiers contenant le mot $mot :
echo $search
else
#Sinon c'est bon et on affiche le résultat obtenu dans l'application xpdf
xpdf $search &
fi

Tu peux aussi faire avec case ... esac si tu en as envie, j'enlève les commentaires, c'est la même chose.

#!/bin/sh

echo -n "Entrer le mot clef se trouvant dans le cours recherché : "
read mot

cd /home/boublil/cours
search=`ls | grep -i $mot`
nfiles=`echo $search | wc -w`
nfiles=`expr $nfiles`

case $nfiles in
0)
echo Aucun cours contenant le mot $mot
;;
1)
xpdf $search &
;;
*)
echo Il y a plusieurs fichiers contenant le mot $mot :
echo $search
;;
esac


J'espère que ça répond à tes interrogations.
Bonne nuit
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 11:29:23

hummm d'accord j'avais oublier la commmande wc -w :)

sinon pourquoi mettre xpdf $search & avec le & ?

Sinon j'aimerai rajouter quelques chose d'autre dans le code , quand il y a plusieurs fichiers avec le meme mot clef j'aimerai proposer à l'utilisateur d'entrer un nouveau mot clef dans le if qui verifie si il est pas vide etc ..

Donc faudrai je pense utiliser un petit while du genre
while (lnfile = 1)
{
if [ -z $search ]
else
xpdf $search
break ;
}

echo "entrer un nouveau mot clef:"
read mot
etc ;;;

Je sais asp trop comment m'y prendre ... :euh:

j'vais pensé à quelque choses comme ceci ...


#! /bin/sh

echo "mot clef:"
read mot

search=`ls|grep -i $mot`
ln=`echo $search | wc -w`

while [ -z $search ] || [ $ln -gt 1 ]
do
echo -n "Je vous invite à entrer un nouveau mot clef:"
read mot
search=`ls|grep -i $mot`
`xpdf $search`
done


;)
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 16:06:16

Bonjour

Le & sert à lancer un processus en arrière-plan. Pour mieux comprendre, ouvre une console et lance par exemple firefox, une fois en mettant le & et une fois sans le mettre.
computer:~ $ firefox &
[1] 5585
computer:~ $

Tu peux continuer à taper des commandes dans la console. En revanche, sans le &.
computer:~ $ firefox

Là tu ne peux pas, il faut attendre que le processus soit terminé, attendre que tu fermes firefox donc. Mais tu peux mettre le processus en sommeil, puis le mettre en background (Ctrl +Z, bg).
computer:~ $ firefox
^Z
[1]+  Stopped                 firefox
computer:~ $ bg
[1]+ firefox &
computer:~ $

Tu peux alors continuer à taper des commandes.

Je te faisais donc mettre un & dans le script pour que tu puisses continuer à utiliser la console (pour une autre recherche par exemple), sans pour autant fermer le pdf déjà ouvert ou faire Ctrl+Z puis bg. Il y a aussi le fait qu'en fermant la console, si le processus n'est pas lancé en background, ça l'arrête. Cela dit... quand c'est mal configuré, même en lançant en background, ça arrête le processus aussi.

En ce qui concerne ton script, je peux te suggérer ceci, j'ai mis beaucoup de choses mais tu peux énormément épurer si tu veux enlever des affichages écran.

#!/bin/sh

cd /home/boublil/cours

echo
echo -n "Saisir un mot-clé : "
read word

search=`ls | grep -i $word`
nfiles=`echo $search | wc -w`
nfiles=`expr $nfiles`

#Pour chercher dans la liste des fichiers déjà trouvés
#et non dans la totalité des fichiers
searchp=`ls`

#Concaténation des mot-clés avec guillemets et virugles
#pour l'affichage écran
#Un mot-clé non trouvé dans la liste des noms de fichiers
#ne sera pas ajouté à la concaténation, on reviendra
#en arrière avec concwordp (p comme précédent)     
concwordp=""
concword=\"$word\"

#Nombre de mots-clés
#Le nombre sera adapté pour ne garder que le nombre de
#mots-clés effectivement trouvés dans les noms de fichiers 
nwords=1

while [ $nfiles -ne 1 ]
do
case $nfiles in
0)
echo
if [ $nwords = 1 ]
then
echo Aucun nom de fichier ne contient le mot-clé $concword
echo
echo -n "Entrer un nouveau mot-clé : "
read word
echo
concword=\"$word\"
else
echo Aucun nom de fichier ne contient les mots-clés $concword
echo
echo -n "Changer le dernier mot-clé saisi ($word) : "
read word
concword=$concwordp,\ \"$word\"
fi
;;
*)
echo
if [ $nwords = 1 ]
then
echo Plusieurs noms de fichiers contiennent le mot-clé $concword
else
echo Plusieurs noms de fichiers contiennent les mots-clés $concword
fi
echo
echo En voici la liste :
echo
echo "$search"
echo
echo -n "Affiner la recherche en saisissant un mot-clé supplementaire : "
read word
concwordp=$concword
concword=$concword,\ \"$word\"
nwords=`expr $nwords + 1`
searchp=$search
;;
esac
search=`echo "$searchp" | grep -i $word`
nfiles=`echo $search | wc -w`
nfiles=`expr $nfiles`
done

xpdf $search &


Bon après-midi
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 16:21:23

Merci à toi :)

PS oulalala ! pas très évident o_O
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 16:46:08

Pas de quoi ;)

Mais ne t'en fais pas, c'est simple en fait. Si tu veux voir une version simplifiée, en voici une par exemple.

#!/bin/sh

cd /home/boublil/cours

echo
echo -n "Saisir un mot-clé : "
read word

search=`ls | grep -i $word`
nfiles=`echo $search | wc -w`
nfiles=`expr $nfiles`

#Pour chercher dans la liste des fichiers déjà trouvés
#et non dans la totalité des fichiers
searchp=`ls`

while [ $nfiles -ne 1 ]
do
case $nfiles in
0)
echo
echo -n "Aucun fichier, saisir un mot-clé : "
read word
;;
*)
echo
echo Mot-clé trouvé, liste des fichiers :
echo
echo "$search"
echo
echo -n "Saisir un mot-clé : "
read word
searchp=$search
;;
esac
search=`echo "$searchp" | grep -i $word`
nfiles=`echo $search | wc -w`
nfiles=`expr $nfiles`
done

xpdf $search &


Et si tu veux des explications sur quelque chose de particulier, pour le script précédent ou celui-ci, n’hésite à pas demander.

Mais pour résumer, on a la liste de fichiers searchp, initialisée au départ avec ls (tous les noms de fichiers) et search est la liste des fichiers de searchp dont le nom contient le mot.

On saisit un premier mot, on cherche le mot dans la liste searchp initiale, on obtient la liste search puis commence la boucle.

1) On regarde si la liste search est réduite à un seul nom de fichier, si ce n'est pas le cas, on passe en 2).

2)
a) Si le mot n'est pas trouvé dans searchp, alors searchp ne change pas. On choisit un nouveau mot qu'on cherchera dans searchp.
b) Si le mot est trouvé, on rétrécit la liste de recherche searchp, on la remplace donc par la liste search qu'on vient de trouver et qui est la liste des fichiers de searchp dont le nom contient le mot. On affine la recherche en saisissant un nouveau mot.

3) On cherche le nouveau mot dans la liste searchp, on obtient la liste search.

4) On revient en 1).

Bye
  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2010 à 17:16:41

humm d'accord, faudrai je m'entraine en shell c'est vraiment magique !

c'est très gentil en tout cas!! je vais étudier tout cas:p :zorro:
  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2023 à 19:19:44 - Message modéré pour le motif suivant : Merci d’utiliser le bouton code pour inséré un code sur le forum


15 avril 2023 à 21:20:29

@MrRebootghost Bonsoir, merci de ne pas squatter le sujet des autres, créer votre propre sujet si vous avez une question dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (Un bonjour ou des salutations à la communauté et se termine par des remerciements par avances pour les futures réponses), la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter