Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 16-01-2016 16:32:21

alpha590
Membre
Inscription : 01-05-2012

aide pour creer un script bash debutant

bonjour

je dois réaliser un script bash afin de determiner quand le contenu d un fichier est modifié je précise que je debute

j ai creé un fichier test.odt puis un script test.sh

voila ce que j ai mis

#!/bin/bash
varfile=/home/toto/Bureau/test.odt
#if test -s "$1" ;
then
echo "le fichier $1  a été modifié"
else
echo "le fichier $1 n a pas changé"
fi



j ai verifie en manipulant des modifications mais cela ne fonctionne quelqu un aurait il une idee et voudrait bien m aider

merci

Edit à toto :
Mise de la balise code bash pour donner de la couleur au code du script.
Voir le tuto : Le code, ça pique moins les yeux en couleur smile

Hors ligne

#2 16-01-2016 18:14:16

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : aide pour creer un script bash debutant

Bonjour,

le

#if test -s "$1" ;

c'est une typo ou un balisage qui a mal tourné ?  tongue


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#3 16-01-2016 18:18:26

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : aide pour creer un script bash debutant

Salut,

je dois réaliser un script bash afin de determiner quand le contenu d un fichier est modifié



Je pense qu'il faut soit récupérer une info comme la date de la dernière modification ou la taille du fichier afin de faire une comparaison...

Un instant et je reviens... big_smile

Sinon en attendant j'ai corrigé un ton script... mais je ne l'ai pas encore testé !  tongue

#! /bin/bash

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'


if [ -s "$1" ]; then
  echo "le fichier $1  a été modifié"
else
  echo "le fichier $1 n a pas changé"
fi



Pour info si tu mets le "then" sur la même ligne que le if il faut un ";" si tu fais un retour à la ligne ce n'ai pas nécessaire. wink

Dernière modification par Slyfox (16-01-2016 18:29:40)

Hors ligne

#4 16-01-2016 18:29:23

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Remarque le « test -s » renvoie vrai si la taille du fichier est différente de zéro.
Ce qu'il faudrait c'est comparer la date de dernière modification avec l'ancienne…
Pour cela on dispose de « test fichier1 -nt fichier2 », ce qui implique qu'il faut deux
fichiers…
Une façon de faire est de copier le fichier original avec « cp -a  » vers un nouveau fichier.
« cp -a » permet de copier tous les attributs du fichier y compris les différentes dates.

Une autre façon est de passer par un autre outil que la comparaison de timestamp de bash.
inotify est adapté à ce genre de surveillance. Voir les man pages :


man 7 inotify
 


Qui permet de prendre connaissance de l'api noyau, ça peut être intéressant.
Je ne sais pas si il existe des programmes utilisateurs qui permettent un accès simple
à cette interface depuis bash. Par contre, cela existe en python, perl et ruby…


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#5 16-01-2016 18:44:22

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : aide pour creer un script bash debutant

Voilà un script fait à l'arrache où je compare 2 fichiers...

#! /bin/bash

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'

dateFichier=$(ls -l --full-time "$1" | awk '{print $6"-"$7}')
dateFichierModifie=$(ls -l --full-time "$2" | awk '{print $6"-"$7}')

if [ "$dateFichier" != "$dateFichierModifie" ]; then
  echo "le fichier $1  a été modifié"
else
  echo "le fichier $1 n a pas changé"
fi



Pour le lancer il faut ouvrir un terminal puis

chemin_du _script chemin_du_premier_fichier chemin_de_deuxième_fichier



Après on peu essayer de comparer la date de création et la date de la dernière modification... big_smile

Je reviens... wink

Dernière modification par Slyfox (16-01-2016 18:46:03)

Hors ligne

#6 16-01-2016 18:55:48

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

En fait, il existe un outil à utiliser dans les script shells (en donc bash aussi wink) qui
utilise inotify, et même plusieurs :

  • inotifywait du paquet inotify-tools

  • iwatch du paquet iwatch


Iwatch semble être conçu pour des environnements exigeants. inotifywait pourrait
mieux correspondre à ton besoin d'après ce que j'ai lu dans le descriptif des paquets
vu que  je n'ai jamais utilisé ces outils. Cependant, c'est une voie intéressante à explorer.


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#7 16-01-2016 18:59:50

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : aide pour creer un script bash debutant

Salut enicar smile

Ben on va essayer d'aller dans ce sens... merci pour l'info. wink

Dernière modification par Slyfox (16-01-2016 19:00:11)

Hors ligne

#8 16-01-2016 19:04:09

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

J'ai trouvé un tuto, je ne sais pas ce qu'il vaut mais c'est intéressant d'y jeter un œil :
http://reflexioninformatique.fr/surveil … rotection/

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#9 16-01-2016 19:37:32

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

re bonjour Slyfox

d abord merci à tous ceux qui m ont répondu Slyfox j ai créé 2 fichiers exemple test.odt  avec aucun contenu et un autre test1. odt avec un text 123
quand je lance le script ./test.sh /home/toto/test.odt /home/toto/test1.odt il me dit que le fichier a ete modifie
par contre quand je remet le fichier test1.ost a 0 il me dit que le fichier a ete modifie comment puis je faire quand aucune modification n a été détecté sur les fichiers

peux tu me dire a quoi correspond cette ligne  car je débute et je n ai pas l habitude
# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'


merci d avance

Hors ligne

#10 16-01-2016 19:48:05

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Remarque, l'utilisation des dates de modifications ne permettent pas de savoir
si le fichier est vraiment différent. Ça permet juste de savoir qu'il y a eu un accès
modifiant le fichier. Comme c'est du .odt, on pourra pas utiliser une comparaison
de fichier, non plus car les métadonnées contenu dans le format .odt peuvent
avoir changées sans que le contenu visuel du fichier affiché par libreoffice ait
changé…
Le problème est complexe avec ce genre de format. Il faudrait un outil
spécifique (qui existe peut être…).

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#11 16-01-2016 19:51:16

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

merci enicar pour ton retour que me conseilles tu alors pour voir si le contenu d un fichier a ete modifie

Hors ligne

#12 16-01-2016 19:58:32

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Pour les fichiers textes, c'est simple. On utilise une simple comparaison de fichiers.
Pour les .odt, je ne sais pas comment faire, les .odt n'étant pas du texte pur.

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#13 16-01-2016 20:16:20

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

enicar pourrais tu me donner un exemple pour les fichiers textes pour comprendre comment cela fonctionne

merci d avance

Hors ligne

#14 16-01-2016 20:28:46

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : aide pour creer un script bash debutant

Voilà un script qui compare le contenu de 2 fichiers.

#!/bin/bash

avant=$(cat $1)
apres=$(cat $2)

if [ "$avant" == "$apres" ]; then
  echo "Le fichier $1 n'pas changé"
else
  echo "Le fichier $1 a été modifié"
fi
 



Je dois m'absenter un instant... je reviens dans une heure... wink

Hors ligne

#15 16-01-2016 20:36:20

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

pour des fichiers textes, c'est très simple, on utilise cmp, de cette façon :


if cmp fichier1 fichier2 >/dev/null ; then
    echo "Les fichiers sont identiques"
else
    echo "Les fichiers sont différents"
fi
 


où fichier1 et fichier2 sont les fichiers à comparer.


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#16 16-01-2016 20:52:38

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

merci beaucoup a tous je regarde cela et je vous tiens au courant

Hors ligne

#17 16-01-2016 20:54:55

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Voilà un exemple plus complet.
Le problème si tu utilises cmp pour savoir quand ton fichier va
être modifié, c'est, d'abord, qu'il faut copier ton fichier dans un
fichier temporaire qui te sert ensuite de référence.  Ensuite, on fait
une boucle qui se répète à intervalle régulier pour faire la
comparaison.
Je vais appeler le fichier temporaire truc-muche-temp, je ne vérifie pas si il existe et
si c'est le cas, je l'écrase  (attention donc !) :


#! /bin/bash
# Petite  précaution pour les erreurs bêtes…
set -e
set -u

# On teste si on nous donne bien un argument
if [ $# = 0 ]; then
    echo "Il me faut un fichier en argument"
    exit 1
fi
#On teste si le fichier existe
if ! [  -e "$1" ]; then
    echo "$1 n'esxiste pas !"
    exit 1
fi

# On copie le fichier dans un fichier temporaire
cp "$1" truc-muche-temp
while cmp "$1" truc-muche-temp >/dev/null; do
    sleep 1 # on attend 1 seconde…
done

echo "Le fichier $1 a été modifié"
 


Le code n'est pas parfait, il peut arriver qu'on loupe une
modification si le fichier est modifié avant la copie, par exemple
il peut arriver aussi d'autres problèmes avec ce genre de code…

Cette technique qui consiste à faire une boucle d'attente avec
sleep, s'appelle le polling. En principe, il vaut mieux éviter
de faire du polling car on occupe le processeur inutilement.

Le « sleep 1 » demande au processus de dormir pendant au moins une
seconde, ce qui fait que ce n'est pas très précis.

Enfin, bon voilà wink

Dernière modification par enicar (16-01-2016 21:03:43)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#18 16-01-2016 21:37:54

Slyfox
Membre
Lieu : Pays du chocolat
Distrib. : GNU/Linux Debian Sid
Noyau : Linux 4.7.0-1-amd64
(G)UI : MATE
Inscription : 15-12-2013

Re : aide pour creer un script bash debutant

alpha590 a écrit :

re bonjour Slyfox

peux tu me dire a quoi correspond cette ligne  car je débute et je n ai pas l habitude
# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'


merci d avance



Mais avec plaisir, du moins je vais essayer. roll

IFS Séparateur interne du champ de saisie.

Cette variable détermine la façon dont Bash reconnaît les champs ou les limites de mots lorsqu'il interprète des chaînes de caractères.

Si on modifie rien, la valeur par défaut est un espace blanc mais peut être changé, par exemple, pour analyser un fichier de données séparées par des virgules ou un retour chariot ou ce qu'on l'on veut.

Voici un exemple...

#!/bin/bash

fichier="mon fichier.odt"

for i in $fichier; do
  echo "$i"
done
echo "=============================="

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'

for i in $fichier; do
  echo "$i"

done
echo "=============================="

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'o'

for i in $fichier; do
  echo "$i"
done
echo "=============================="



Comme tu peux le voir dans le deuxième exemple j'ai modifié IFS par un retour de chariot et dans le troisième j'ai choisi la lettre "o" comme séparateur.

J’espère avoir répondu à ta question, n'hésite pas si tu as encore des questions, il y a plein de gens ici qui se feront le plaisir te de répondre.  cool

Dernière modification par Slyfox (16-01-2016 21:39:51)

Hors ligne

#19 17-01-2016 10:51:30

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

rebonjour a tous

j ai créé 2 fichiers pour tester  pour vérifier qd ceux ci  ont ete modifies ex: test et test1 j ai essaye le script

#! /bin/bash

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'

dateFichier=$(ls -l --full-time "$1" | awk '{print $6"-"$7}')
dateFichierModifie=$(ls -l --full-time "$2" | awk '{print $6"-"$7}')

if [ "$dateFichier" != "$dateFichierModifie" ]; then
  echo "le fichier $1  a été modifié"
else
  echo "le fichier $1 n a pas changé"
fi



mais apparemment celui ci ne fonctionne pas même qd les fichiers n ont pas ete  modifies

quelqu un aurait il une idee
merci d avance a tous pour votre aide

Edit (bis) à toto :
Mise de la balise code bash pour donner de la couleur au code du script. Voir par Modifier en bas à droite pour ce qu'il en est dans ce post.
Voir le tuto : Le code, ça pique moins les yeux en couleur smile

Hors ligne

#20 17-01-2016 11:54:00

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Il faut que tu nous expliques comment tu utilises ton script. Que veux-tu dire exactement
quand tu dis : « Celui-ci ne fonctionne pas même quand les fichiers n'ont pas été modifiés » ?

De plus, dans ce script tu compares les « dates » de deux fichiers différents… Ce qu'il faut
pour savoir quand un fichier est modifié, c'est comparé la date de modification à intervalle régulier
par rapport à son horodatage qu'il avait au début du script… Mais, il y a beaucoup mieux
en utilisant inotify, ça évite de faire une boucle d'attente. Je vais regarder comment
on l'utilise  et je te propose un exemple wink

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#21 17-01-2016 12:10:56

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

merci pour ton retour

voila comment je teste
1 les fichiers sont vides pour vérifier s il me renvoie bien qu aucun de ces fichiers n a été modifié mais il me renvoie à chaque  fois que le fichier a ete modifie
2. j ai essaye dans les 2 cas de mettre du texte dans le fichier test et test 1
dans tous les cas j ai toujours  comme message que le fichier a été modifie
je lance mon script de la manière suivante
/.script.sh /chemin du fichier test /chemin du fichier test1

je vous avoue que je debute inotify je ne connais pas mais je vais jeter un oeil

merci pour votre aide

Hors ligne

#22 17-01-2016 12:26:43

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Finalement on ne peut pas attendre que l'horodatage soit modifié
avec inotifywait. Mais on peut être notifié lorsque le fichier
est modifié. C'est d'avantage ce que tu voulais, non ?

Pour utiliser inotify, je vais utiliser inotifywait et
donc il faut installer le paquet correspondant :


apt-get install inotify-tools
 



Je te propose ce script, qui attend que le  fichier passé en argument
soit modifié, j'appelle ce script attente_de_modification.bash


#! /bin/bash
# Quelques précautions
set -e
set -u

# On teste si on nous donne bien un argument
if [ $# = 0 ]; then
    echo "Il me faut un fichier en argument"
    exit 1
fi

# On teste si le fichier existe
if ! [  -e "$1" ]; then
    echo "$1 n'esxiste pas !"
    exit 1
fi

inotifywait -e modify "$1"
echo "$1 a été modifié"
 



Il faut que je t'explique comment on s'en sert. D'abord
tu crées un fichier sans importance :


echo "fichier test" >fichier_test
 


Dans un terminal, tu lances le script attente_de_modification.bash


bash attente_de_modification.bash fichier_test
 


Tu ouvres un autre terminal, et tu tapes la commande suivante


echo "modification" >>fichier_test
 


On ajoute une ligne à fichier_test, la commande
inotifywait va être notifié par le noyau que le fichier est modifié
et le script attente_de_modification.bash va se terminer.
Tu pourras le voir dans le premier terminal, ça affichera :


Setting up watches.
Watches established.
fichier_test MODIFY
fichier_test a été modifié
 



Bon, j'espère que tu arriveras à faire fonctionner cet exemple wink


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#23 17-01-2016 12:43:00

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

alpha590 a écrit :

1 les fichiers sont vides pour vérifier s il me renvoie bien qu aucun de ces fichiers n a été modifié mais il me renvoie à chaque  fois que le fichier a ete modifie


En réalité, ton script te dit que les deux horodatages sont différents.

Je te propose un exemple basé sur ton code, mais mis à ma sauce, et à utiliser
comme mon script précédent (c'est à dire avec deux terminaux), celui-ci
je l'appelle attente_changement_horodatage.bash :


#! /bin/bash

# Quelques précautions
set -e
set -u

# modification de l'IFS pour qu'il passe en saut de ligne
old_IFS=${IFS} IFS=$'\n'

# On teste si on nous donne bien un argument
if [ $# = 0 ]; then
    echo "Il me faut un fichier en argument"
    exit 1
fi

# On teste si le fichier existe
if ! [  -e "$1" ]; then
    echo "$1 n'esxiste pas !"
    exit 1
fi


dateFichier=$(ls -l --full-time "$1" | awk '{print $6"-"$7}')
dateFichierModifie=$(ls -l --full-time "$1" | awk '{print $6"-"$7}')

# On attend que l'horodatage du fichier change…
while [ "$dateFichier" = "$dateFichierModifie" ]; do
    sleep 1
    dateFichierModifie=$(ls -l --full-time "$1" | awk '{print $6"-"$7}')
done

echo "$1 a changé d'horodatage"
 


Pour modifié l'horodatage, tu peux te servir de la commande touch.
Donc tu vas créer un fichier test :


echo "fichier test" >fichier_test
 


Dans un premier terminal, tu lances le script d'attente :


bash attente_changement_horodatage.bash fichier_test
 


Dans le second terminal, tu exécutes la commande suivante :


touch fichier_test
 


Et tu regardes ce qu'il se passe dans le premier terminal wink


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#24 17-01-2016 14:41:47

alpha590
Membre
Inscription : 01-05-2012

Re : aide pour creer un script bash debutant

je me permets de revenir vers toi j ai bien suivi tes instructions  mais quand je suis dans le premier terminal et que je lance la commande  bash attente_changement_horodatage.bash fichier_test
il signale  bash: attente_changement_horodatage.bash: Aucun fichier ou dossier de ce type
alors que le fichier existe

merci

Hors ligne

#25 17-01-2016 14:46:59

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : aide pour creer un script bash debutant

Il faut que tu enregistres le code que je t'ai donné dans un fichier appelé
attente_changement_horodatage.bash Et que tu l'utilises dans le répertoire
où tu l'as sauvegardé… Si bash te dit que le fichier n'existe pas, c'est que tu n'es pas au bon endroit.
Tu devrais tout faire dans ton home, pour simplifier…

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

Pied de page des forums