Exécuter une commande dans un if (bash)
Résolu
DarKCoX
-
asevere Messages postés 13521 Statut Webmaster -
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 !
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:
- Exécuter une commande dans un if (bash)
- Invite de commande - Guide
- Commande terminal mac - Guide
- Diskpart commande - Guide
- Commande dism - Guide
- Commande scannow - Guide
5 réponses
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 ;-((
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
"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...
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 :/
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 ?
Je vais tester ça dès que possible.
++
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 !
Remplace par et dis nous si ton resultat semble plus cohérent ;-)
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 !
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...