Exécuter une commande dans un if (bash)

Résolu
DarKCoX -  
asevere Messages postés 13521 Statut Webmaster -
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 41342 Statut Modérateur 4 896
 
Salut,
if [ "$(find . -name $line | wc -l)" -eq "0" ]
Devrait le faire ;-))
0
DarKCoX
 
Merci beaucoup jipicy,

Je vais tester ça dès que possible.
++
0
DarKCoX
 
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 13521 Statut Webmaster 426 > DarKCoX
 
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 13521 Statut Webmaster
 
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 13521 Statut Webmaster 426 > DarKCoX
 
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 41342 Statut Modérateur 4 896
 
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 13521 Statut Webmaster 426
 
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 13521 Statut Webmaster
 
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 13521 Statut Webmaster 426 > DarKCoX
 
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 13521 Statut Webmaster 426 > DarKCoX
 
à 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 13521 Statut Webmaster
 
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 41342 Statut Modérateur 4 896
 
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
DarKCoX
 
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 41342 Statut Modérateur 4 896 > DarKCoX
 
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 41342 Statut Modérateur
 
"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 41342 Statut Modérateur
 
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 41342 Statut Modérateur 4 896 > DarKCoX
 
Ben il semblerait oui ;-((

Et en root, ça passe ?
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
DarKCoX
 
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
DarKCoX
 
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 13521 Statut Webmaster 426
 
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