Exécuter une commande dans un if (bash)

Résolu/Fermé
DarKCoX - 23 janv. 2009 à 11:20
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 - 26 janv. 2009 à 11:10
Bonjour,

J'ai une question assez simple :
Comment dans mon if, je peux exécuter un find ?

Ca donnerait ça à peu près :

if [(find . -name $line | wc -l) -eq 0]
then $line >> plop
fi

Je travaille sous HP-UX.

Merci à tous !
A voir également:

5 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
23 janv. 2009 à 11:23
Salut,
if [ "$(find . -name $line | wc -l)" -eq "0" ]
Devrait le faire ;-))
0
Merci beaucoup jipicy,

Je vais tester ça dès que possible.
++
0
Jipicy,

Merci encore mais j'ai l'impression que le résultat escompté n'est pas atteint :/

Voici le petit script :
while read line
do
if [ "$(find /var/plop/ -name $line | wc -l)" -eq "0" ]
then $line >> /usr/new
fi
done < $1
exit 0

Je souhaite comparer l'arborescence de /var/plop (profondeur > 1) avec les lignes de mon fichier d'entree ($1) et rajouter chaque ligne de nom de fichier inexistant dans un nouveau fichier afin de savoir quels fichiers sont nouveaux.

A l'heure actuelle, j'ai l'impression qu'il ne cherche pas dans sous-répertoires de plop.
As-tu une idée ?

J'espère être assez clair :p
Merci pour ton aide !
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > DarKCoX
23 janv. 2009 à 14:07
Salut,

Remplace
then $line >> /usr/new
par
then echo $line >> /usr/new
et dis nous si ton resultat semble plus cohérent ;-)
0
DarKCoX > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
23 janv. 2009 à 14:12
Oui c'est déjà fait merci :)

Mais en fait le problème maintenant c'est que les noms des fichiers ne sont pas identiques aux noms des lignes même s'ils correspondent à la même chose.
Il faudrait que je puisse dire de vérifier si la chaîne de la ligne fait partie du nom du fichier auquel je le compare (c'est compréhensible ?)

et également vérifier si la taille correspond afin d'être certain (je crois qu'il faut que je rajoute un -size et un &&)

as-tu une idée ?
Merci !
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > DarKCoX
23 janv. 2009 à 14:15
Heu... si tu nous mettais un exemple :)

exemple du fichier, exemple de l'arbo, et exemple du resultat :)

Si tu souhaite verifier deux arbo identique, je ne suis pas sur que tu parte sur la bonne voix...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
23 janv. 2009 à 14:50
Et un truc du genre ça le ferait pas ?
while read line
do
find /var/plop/ -type f -name "$line"  >/dev/null
if [ "$?" = "1" ]
then $line >> /usr/new
fi
done < $1
exit 0 
Edit : Oups non ça marche pas, le code retour est toujours égal à 0 si il n'y a pas d'erreur rencontrée ;-((
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
23 janv. 2009 à 15:00
Salut JP,

Chez moi, find retournera toujour 0 pour peut que l'utilisateur ait un droit de lecture sur l'ensemble de l'arbo... sinon, effectivement un
find ... || echo machin
serait idéal :)
0
DarKCoX > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
23 janv. 2009 à 15:14
euh ben là si j'utilise find '*' ou find "*" il ne crée plus le fichier de sortie du tout
Je suppose donc qu'il ne comprend pas la condition.
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > DarKCoX
23 janv. 2009 à 15:24
C'est pour ça que je te demandais si les commandes find marchaient toutes seules, sans le reste du script... autant procéder par étape avec un système sur lequel nous on ne peut pas tester :)
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > DarKCoX
23 janv. 2009 à 15:28
à tout hasard, peux-tu avoir /var/plop/rep1/fichier et /var/plop/rep2/autre_fichier ou est-ce que tous les fichiers se trouvent dans un seul répertoire ? (dans le second cas, ça serait simplissime, on peut rever :) )
0
DarKCoX > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
23 janv. 2009 à 16:02
Les fichiers se trouvent dans plusieurs sous-répertoires :p

Merci de votre aide à tous les deux en tout cas !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
23 janv. 2009 à 16:59
On peut avoir le résultat de :
var="nom_de fichier_qui existe_dans_ton_répertoire" # (ie : mon_plop.txt)
var1="nom_de fichier_tronqué_qui existe_dans_ton_répertoire" # (ie : plop)

find . -type f -name "$var" -print
find . -type f -name "$var1" -print
find . -type f -name "*$var" -print
find . -type f -name "*$var1" -print
find . -type f -name "*$var*" -print
find . -type f -name "*$var1*" -print
0
Le problème est que plop ta var1 est une ligne d'un fichier que je lis (cf message avec script) et non un fichier.
Je lis le fichier ligne par ligne et je compare avec le nom des fichiers du répertoire et sous-répertoires cibles.
Si un nom de fichier de ces répertoires ne match pas avec une des lignes de mon fichier d'entrée ($1) alors j'écris cette ligne dans un fichier de sortie pour savoir qu'il n'est pas présent dans ces répertoires et que je dois l'ajouter ultérieurement.

Suis-je assez clair ?

Merci pour ton aide
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > DarKCoX
23 janv. 2009 à 17:35
Tout ça je l'avais bien compris, ce que j'essaie de (sa)voir c'est comment sont interprétés les astérisques (*) par ton shell, d'où ma demande ;-))

En fonction de l'interprétation, j'ai peut être une solution...
0
DarKCoX > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
23 janv. 2009 à 17:53
"test.sh" 12 lines, 269 characters
#!/bin/sh
var="RIP2-MIB.mib"
var1="RIP2"

find . -type f -name "$var" -print
find . -type f -name "$var1" -print
find . -type f -name "*$var" -print
find . -type f -name "*$var1" -print
find . -type f -name "*$var*" -print
find . -type f -name "*$var1*" -print
exit 0

~
~
~
~
~
~
~
~
~
~
~
"test.sh" 12 lines, 269 characters
bash-3.2$ ./test.sh
./RIP2-MIB.mib
./RIP2-MIB.mib
./RIP2-MIB.mib
./RIP2-MIB.mib
bash-3.2$ vi test.sh
"test.sh" 12 lines, 269 characters
#!/bin/sh
var="RIP2-MIB.mib"
var1="IP2"

find . -type f -name "$var" -print
find . -type f -name "$var1" -print
find . -type f -name "*$var" -print
find . -type f -name "*$var1" -print
find . -type f -name "*$var*" -print
find . -type f -name "*$var1*" -print
exit 0

~
"test.sh" 12 lines, 268 characters
bash-3.2$ ./test.sh
./RIP2-MIB.mib
./RIP2-MIB.mib
./RIP2-MIB.mib
./RIP2-MIB.mib


Cela semble fonctionner...
0
DarKCoX > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
23 janv. 2009 à 18:01
En fait, serait-il possible que cela provienne d'un problème de permission pour l'exécution de la commande find ?

quand je fais un find à partir du shell, j'ai ce genre de résultat :

bash-3.2$ find / -name SNMPv2-MIB.mib
find: cannot open /etc/opt/resmon/persistence
find: cannot open /etc/opt/resmon/pipe
find: cannot open /etc/opt/OV/share/conf/analysis/requests/C/export/trend
find: cannot open /etc/opt/OV/share/conf/analysis/requests/C/trim
find: cannot search /etc/opt/OV/share/conf/SFR_sets_trap
find: cannot open /etc/opt/ldapux/bck_15112007
find: cannot search /opt/ssh/src
find: cannot open /opt/hpsmh/tomcat/conf
find: cannot open /opt/hpsmh/tomcat/work
find: cannot open /opt/hpservices
find: cannot search /opt/VRTSvxms/PA/logs
find: cannot search /opt/VRTSvxms/logs
find: cannot search /opt/OV/newconfig/AvayaIcon/bitmaps/C/vendor/Avaya
find: cannot search /opt/OV/newconfig/AvayaIcon/conf/oid_to_sym_reg/001_HP
find: cannot search /opt/OV/newconfig/AvayaIcon/symbols/C/Vendor/Avaya

Si c'est ça le problème je m'excuse pour le dérangement :/
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > DarKCoX
23 janv. 2009 à 18:13
Ben il semblerait oui ;-((

Et en root, ça passe ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
23 janv. 2009 à 23:13
Au cas ou, je te colle le semblant de solution que j'avais (à condition d'avoir les droits sur les répertoires visités et que le développement des noms de fichiers se fasse correctement, à priori ça devrait) :
#! /bin/sh

#set -xv

while read line
do
find . -type f -name "*${line}*" -exec basename {} \; | grep "$line" >/dev/null 2>&1
if [ "$?" -eq "1" ]
then echo "$line" >> fichier.sortie
fi
done < fichier.liste
;-))
0
Merci Jipicy pour ces infos.

Je vais voir si j'arrive car je ne peux pas me logger en root sur la machine.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jipicy,

Je n'ai pas essayé ton code par contre, l'ancien code fonctionne.

Le problème était simple :
mes noms de lignes se terminaient par une extension de fichier alors que dans le répertoire de recherche; les noms des fichiers n'avaient pas cette extension.

J'ai donc supprimer les extensions en vi et en relançant le script de base, cela a fonctionné.

Merci encore pour ton aide ainsi qu'à asevere.

A bientôt :p

PS : comment indiquer que le thread est résolu ?
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
26 janv. 2009 à 11:10
Salut,

Si tu as coché "recevoir les réponses par mail", tu as un lien te permettant de changer le statut en résolu, sinon, il faut être membre lors de la question initiale, dans le doute, j'ai changé le statut :-)

A plus
0