If avec la commande find (modif de fichiers)

Résolu/Fermé
ludivine - Modifié le 5 oct. 2021 à 15:26
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 7 oct. 2021 à 12:20
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.
  • 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
A voir également:

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épertoire
test
qui est dans
/tmp/
.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
5 oct. 2021 à 15:33
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
0
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égrer
ssh
à mon
if
car le dossier à checker se trouve sur un autre PC. Pour le moment je cherche encore
0
merci bcp
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 6 oct. 2021 à 11:05
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 commande
find
) 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 via
ssh
simplement en la précédent de la commande
ssh login@machine
, par exemple
ssh 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 utilises
ssh
.

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
0
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 [].
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > ludivine
Modifié le 6 oct. 2021 à 12:08
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
0

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
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
7 oct. 2021 à 12:20
Merci pour ton retour, bonne découverte du shell et bonne journée :-)
0