If avec la commande find (modif de fichiers)
Résolu
Bonjour
Je n'arrive pas à trouver sur le net et je débute en script.
J'aimerais faire un script qui me permet d'examiner un répertoire.
J'essaye avec une boucle :
Mais le
Pouvez- vous m'aider s'il vous plaît ?
Merci
Je n'arrive pas à trouver sur le net et je débute en script.
J'aimerais faire un script qui me permet d'examiner un répertoire.
- si un des fichiers du répertoire a bougé dans les 10 minutes (modification d'un ficher ou ajout) alors j'affiche
no new
; - sinon j'affiche
new
.
J'essaye avec une boucle :
#!/bin/bash if find /tmp/test/ -mmin -10 -eq 'False'; then echo "no new" else; echo "new" fi
Mais le
-eq 'False'ne fonctionne pas : je ne trouve pas l'équivalent pour la commande
find, ou alors je me trompe de commande.
Pouvez- vous m'aider s'il vous plaît ?
Merci
5 réponses
-
Je viens de modifier
!/bin/bash if find /tmp/test/ -mmin -10 | xargs ls -l then echo 'Found something' else echo 'Found nothing' fi
... mais j'ai un soucis : il me prend en compte les répertoires du dessus. Moi, je ne veux que le répertoiretest
qui est dans/tmp/
. -
Bonjour,
Je n'ai pas très bien compris quel était ton problème dans la deuxième version.
Pour commencer, je ne vois pas l'intérêt de| xargs ls -l
à ce stade, donc je vais l'ignorer pour le moment.
Comme tu le vois ci-dessous,/tmp/test1
n'est pas listé, mais/tmp/test
et/tmp/test/test2
sont bien listés.
(mando@silk) (~) $ mkdir /tmp/test
(mando@silk) (~) $ find /tmp/test/ -mmin -10
/tmp/test/
(mando@silk) (~) $ touch /tmp/test1
(mando@silk) (~) $ find /tmp/test/ -mmin -10
/tmp/test/
(mando@silk) (~) $ touch /tmp/test/test2
(mando@silk) (~) $ find /tmp/test/ -mmin -10
/tmp/test/
/tmp/test/test2
Bonne chance -
Merci pour ton aide .
J'ai fait une autre modification en suivant des forums.
#!/bin/bash if [[ -n $(find /tmp/test/ -mmin -5) ]] then echo 'Found something' else echo 'Found nothing' fi
Cette version fonctionne même si je ne comprends pas trop le-n
au début ?
Je suis en train d'essayer de la modifier pour intégrerssh
à monif
car le dossier à checker se trouve sur un autre PC. Pour le moment je cherche encore -
Bonjour Ludivine,
Cette version fonctionne même si je ne comprends pas trop le -n au début ?
Cette page recense les différents opérateurs que l'on peut utiliser dans un test en bash. Comme tu le verras, l'opérateur-n
vérifie si la chaîne testée (en l'occurrence, le résultat de ta commandefind
) n'est pas la chaîne vide. C'est donc un peu plus rigoureux même si sans-n
, le code est tout aussi correct.
Je suis en train d'essayer de la modifier pour intégrer un ssh à mon if car le dossier à checker se trouve sur un autre pc.
Tu peux lancer une commande shell viassh
simplement en la précédent de la commandessh login@machine
, par exemplessh mando@localhost ls /
. Note qu'il peut être intéressant de préparer une clé ssh qui permettra d'éviter d'avoir à taper ton mot de passe à chaque fois que tu utilisesssh
.
Dans ton cas ça pourrait ressembler à ça :
#!/bin/bash user="ludivine" host="11.22.33.44" if [[ -n $(ssh "$user"@"$host" find /tmp/test/ -mmin -5) ]] then echo 'Found something' else echo 'Found nothing' fi
Bonne chance-
Bonjour mamiemando
Merci pour ton aide et ta precision sur le-n
.
je viens de faire une modification mais je ne sait pas trop comment concaténer ma commande pour qu'elle fonctionne.
Actuellement j'ai (error et logger sont des fonctions )
if ${ssh} ${SSH_USER}@${IP_PC_INDUS} -p ${SSH_PORT} "find ${USERREP} -mmin -1" then logger "on continue" else error "pas de modifications" fi
Mais dans mon cas là, je perds l'option-n
car je ne sais pas comment concaténer correctement le tout [].- Voici ce que tu peux faire :
#!/bin/sh ssh_login="mando" ssh_host="localhost" ssh_port=22 ssh_prefix="ssh $ssh_login@$ssh_host -p $ssh_port" user_dir="/tmp/test" if [[ -n $($ssh_prefix find "$user_dir" -mmin -1) ]] then echo "on continue" else echo "pas de modifications" fi
Exemple :
(mando@silk) (~) $ bash toto.sh
mando@localhost's password:
find: ‘/tmp/test’: Aucun fichier ou dossier de ce type
pas de modifications
(mando@silk) (~) $ touch /tmp/test
(mando@silk) (~) $ bash toto.sh
mando@localhost's password:
on continue
Quelques recommandations- Avec l'opérateur
$
tu peux omettre quand il n'y a pas d'ambiguités les accolades. J'ai donné la syntaxe avec car c'est la plus rigoureuse et ça permet de faire des trucs assez violents, genre crafter des noms de variables à partir des valeurs d'autres variables, mais ici on n'en n'a pas besoin. - Dans le cas général, une valeur de variable peut contenir des espaces, ce qui peut complètement casser ton programme (voire être un trou de sécurité) donc il faut autant que possible encadrer les valeurs de variables avec des guillemets ou des apostrophes, en particulier pour les noms de fichiers qui peuvent en contenir (e.g.
$user_dir
). Attention cependant, car tu ne peux/dois pas le faire partout (par exemple, si le fait pour$ssh_port
ou$ssh_host
,ssh
sera perdu). - Je te recommande pour les noms de dossiers d'utiliser le suffixe
_dir
, c'est ce qui est communément utilisé. - Au sujet des noms de variables, tu peux utiliser des majuscules ou des minuscules. Personnellement j'ai tendance à utiliser des minuscules pour les variables internes et des majuscules pour les variables externes (construites à partir des arguments passés au script shell, e.g
$1
,$2
etc.). Dans d'autre langages, on réserve les noms de variables majuscules aux constantes globales. - Toujours à ce sujet, je t'invite à les nommer de manière consistante, claire, et en "prévision du futur" est toujours une bonne idée. Par exemple, le préfixe
ssh_
permet de trouver avec l'auto-complétion toutes les variables liées à ssh, améliore la lisibilité, et permet d'éviter un renommage si ton script implique par la suite un autre service réseau.
Bonne chance - Avec l'opérateur
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Un énorme merci pour ce message clair je viens d'apprendre plein de nouvelles choses.
J'ai encore beaucoup beaucoup de choses à apprendre sur le scripting shell.
Encore merci pour ton aide précieuse.
Je te souhaite une bonne journée