Exécuter une commande dans un if (bash)
Résolu/Fermé
DarKCoX
-
23 janv. 2009 à 11:20
asevere Messages postés 13087 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 - 26 janv. 2009 à 11:10
asevere Messages postés 13087 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 - 26 janv. 2009 à 11:10
A voir également:
- Exécuter une commande dans un if (bash)
- Invite de commande - Guide
- Commande terminal mac - Guide
- Commande dism - Guide
- Diskpart commande - Guide
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 897
23 janv. 2009 à 11:23
23 janv. 2009 à 11:23
Salut,
if [ "$(find . -name $line | wc -l)" -eq "0" ]Devrait le faire ;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 janv. 2009 à 14:50
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 0Edit : Oups non ça marche pas, le code retour est toujours égal à 0 si il n'y a pas d'erreur rencontrée ;-((
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
426
23 janv. 2009 à 15:00
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
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 machinserait idéal :)
DarKCoX
>
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
23 janv. 2009 à 15:14
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.
Je suppose donc qu'il ne comprend pas la condition.
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
426
>
DarKCoX
23 janv. 2009 à 15:24
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 :)
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
426
>
DarKCoX
23 janv. 2009 à 15:28
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 :) )
DarKCoX
>
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
23 janv. 2009 à 16:02
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 !
Merci de votre aide à tous les deux en tout cas !
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 janv. 2009 à 16:59
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
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
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
DarKCoX
23 janv. 2009 à 17:35
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...
En fonction de l'interprétation, j'ai peut être une solution...
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
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...
#!/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...
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
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 :/
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 :/
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
DarKCoX
23 janv. 2009 à 18:13
23 janv. 2009 à 18:13
Ben il semblerait oui ;-((
Et en root, ça passe ?
Et en root, ça passe ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 janv. 2009 à 23:13
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;-))
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 ?
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 ?
asevere
Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
426
26 janv. 2009 à 11:10
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
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
23 janv. 2009 à 11:32
Je vais tester ça dès que possible.
++
23 janv. 2009 à 14:00
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 !
23 janv. 2009 à 14:07
Remplace par et dis nous si ton resultat semble plus cohérent ;-)
23 janv. 2009 à 14:12
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 !
23 janv. 2009 à 14:15
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...