Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/05/2014, à 12:45

omnimax

problème script surveillance dernier fichier

Bonjour j'aimerai automatiser l'envoi d'un mail dès que l'on ajoute un fichier sur Dropbox.
Voilà l'ébauche de mon script.

#!/bin/bash
#dropboxalert 
empl=$HOME/Dropbox/
while inotifywait -e create "$empl"; do
sleep 10s # je rajoute ceci pour être sûr que le fichier soit correctement copié
fic=$(ls -R -c -t -I dropboxalert -I dropboxalert~ --reverse "$empl" | tail -n 1) # j'écarte avec -I le nom du script et de sa copie auto car avec les test je l'enregistre souvent
echo "$fic"
done
exit 0

inotifywait marche parfaitement et me retourne automatiquement le fichier créé.
par contre

fic=$(ls -R -c -t -I dropboxalert -I dropboxalert~ --reverse "$empl" | tail -n 1) 
echo "$fic"

ne me renvoi pas le dernier fichier mais l'avant dernier....:( on dirait que le simple fait de lister avec ls change le dernier fichier ajouté ???
si qqun peux éclairer ma lanterne ...Merci

Dernière modification par omnimax (Le 29/05/2014, à 12:49)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#2 Le 29/05/2014, à 14:16

Nolanux

Re : problème script surveillance dernier fichier

Et si tu essaie ceci ?

ls -Rltc 

D'après le man, il semblerait que tu doives ajouter l'option -lt avec -c pour pouvoir trier en utilisant le paramètre Ctime, si tu utilise uniquement l'opion -l il affiche Ctime, mais il trie par le nom


Pas démonter Numéro 5 !
"Short Circuit"

Hors ligne

#3 Le 29/05/2014, à 18:20

omnimax

Re : problème script surveillance dernier fichier

j'ai essayé mais ta soluce ne fonctionne pas non plus. c'est vraiment bizarre;

d'habitude je fais souvent  pour avoir le dernier fichier:

ls -c --color=auto -l -t -h --reverse

et cela marche très bien dans ce cas mais via mon script cela ne donne pas le même résultat.

J'ai trouvé ceci plus pompeux mais qui fonctionne

#!/bin/bash
empl=$HOME/Dropbox/
coucou=$HOME/Bureau/list
while inotifywait -e create "$empl" > "$coucou"; do
list=$(cat "$coucou")
echo "$list"
done
exit 0

Dernière modification par omnimax (Le 29/05/2014, à 19:15)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#4 Le 29/05/2014, à 18:29

Nolanux

Re : problème script surveillance dernier fichier

bizarre oui, parce qu'ici, ça fonctionne ... Je viens d'essayer de nouveau.
tu n'aurais pas créé un alias entre temps ?

Dernière modification par Nolanux (Le 29/05/2014, à 18:30)


Pas démonter Numéro 5 !
"Short Circuit"

Hors ligne

#5 Le 29/05/2014, à 19:59

omnimax

Re : problème script surveillance dernier fichier

non mon ls n'a pas un alias ls

je viens de reproduire l'erreur


touch coucou
CHEMIN:  /home/omnimax   DATE:  jeu 29 mai  21:00:09       
-->  ls -c --color=auto -l -t -h --reverse -R | tail -n 1
-rw-r--r-- 1 syst syst 111M mai 28 20:16 BONUS.zip
CHEMIN:  /home/omnimax   DATE:  jeu 29 mai  21:00:11       
-->  

et coucou a bien été créé.

j'aimerai vraiment comprendre le pourquoi.

Dernière modification par omnimax (Le 29/05/2014, à 20:00)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#6 Le 29/05/2014, à 20:09

omnimax

Re : problème script surveillance dernier fichier

j'ai compris l'erreur mais sans savoir la résoudre

ls -R

va chercher récursivement mais sans trier l'ensemble des dossiers par date, seul le dernier résultat sera juste avec 

ls -c --color=auto -l -t -h --reverse

il faudrait pouvoir trier le résultat de ls -R par date puis appliquer le dernier en date


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#7 Le 29/05/2014, à 20:10

omnimax

Re : problème script surveillance dernier fichier

trouvé !

ls -c --color=auto -l -t -h --reverse -R | ls -c --color=auto -l -t -h --reverse | tail -n 1

Dernière modification par omnimax (Le 29/05/2014, à 20:10)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#8 Le 29/05/2014, à 20:40

Watael

Re : problème script surveillance dernier fichier

salut,

ls est une des rares commandes qui "ne lit pas son entrée standard" (je ne saurais pas l'expliquer), ceci implique que le second ls ne lit aucunes données venant du premier sad
par exemple :

$ ls ./
fichier1 fichier2
$ echo $HOME | ls
fichier1 fichier2

Dernière modification par Watael (Le 29/05/2014, à 20:41)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 29/05/2014, à 20:43

pingouinux

Re : problème script surveillance dernier fichier

Bonsoir,
Ceci devrait marcher aussi :

ls -clthR --color=auto --time-style=+"%Y%m%d%H%M%S" tst| sort -k6 | tail -1

Je ne comprends pas comment fonctionne ta commande en #7. Pour moi, les 2 commandes suivantes sont équivalentes :

ls -c --color=auto -l -t -h --reverse -R | ls -c --color=auto -l -t -h --reverse | tail -n 1
ls -c --color=auto -l -t -h --reverse | tail -n 1

Édité : Trop rapide, Watael

Dernière modification par pingouinux (Le 29/05/2014, à 20:44)

Hors ligne

#10 Le 29/05/2014, à 20:59

Postmortem

Re : problème script surveillance dernier fichier

Bonsoir,
Pour éviter de remonter la création d'un fichier particulier :

inotifywait -e create --exclude "^/tmp/test/ff$" /tmp/test

Ça remonte les fichiers créés dans /tmp/test sauf si le fichier est /tmp/test/ff.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 29/05/2014, à 21:06

pingouinux

Re : problème script surveillance dernier fichier

Un peu plus simple que ma proposition en #9 :

ls -clthR --time-style=+"%s" | sort -nk6 | tail -1

Hors ligne

#12 Le 29/05/2014, à 21:27

omnimax

Re : problème script surveillance dernier fichier

merci mais cela ne fonctionne toujours pas
noté postmortem pour l'option exclude wink

#!/bin/bash
#dropboxalert
empl=$HOME
while inotifywait -e create "$empl"/* 
do
essai=$(ls -clthR --time-style=+"%s" | sort -nk6 | tail -1)
echo "$essai"
done
exit 0
touch coucou

résultat :

/home/omnimax/ CREATE coucou
-rwxr-xr-x 1 omnimax omnimax  301 1401395267 dropboxalert~

Dernière modification par omnimax (Le 29/05/2014, à 21:37)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#13 Le 29/05/2014, à 21:37

pingouinux

Re : problème script surveillance dernier fichier

C'est sans doute que tu as plusieurs fichiers qui ont même date et même heure à la seconde près.
(tu peux essayer avec tail -n 5, par exemple)

Dernière modification par pingouinux (Le 29/05/2014, à 21:38)

Hors ligne

#14 Le 29/05/2014, à 21:56

Postmortem

Re : problème script surveillance dernier fichier

Tu pourrais faire comme ça :

while fic=$(inotifywait -e create /tmp/test --format %w%f)
do
   ls -lc "$fic"
done

Ainsi, tu fais le ls que sur le fichier nouvellement créé.
Je pense que le "ls -clt" donne un classement bizarre car -c ne donne pas la date de création mais la date de dernier changement de statut.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 29/05/2014, à 22:08

Watael

Re : problème script surveillance dernier fichier

ls -lc fichier

ce seul fichier sera effectivement correctement trié selon sa date de modification.

sauf que... un seul fichier ne peut pas être trié. hmm
lol

Dernière modification par Watael (Le 29/05/2014, à 22:09)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 29/05/2014, à 22:25

Postmortem

Re : problème script surveillance dernier fichier

Non mais de ce que j'ai compris, il veut les infos du fichier nouvellement créé, donc autant faire le ls seulement sur lui plutôt que d'essayer de trier pour sortir le dernier fichier !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#17 Le 29/05/2014, à 22:53

Watael

Re : problème script surveillance dernier fichier

on est presque vendredi wink

moi, je ferais comme ça:

while inotifywait -e create ./; do stat -c '%Y %n' ./*  |sort -k1,1n | cut -d ' ' -f2 | tail -n1; done

ça à l'air de fonctionner.
je préfère stat, dont je maîtrise le format d'affichage, quitte à lui adjoindre un sort.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 29/05/2014, à 23:04

Postmortem

Re : problème script surveillance dernier fichier

Mais pourquoi s'embêter avec le tri alors qu'inotifywait peut sortir directement le nom qu'on veut ?
Une fois le nom récupéré, on utilise stat, ls ou ce qu'on veut sur le fichier.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#19 Le 29/05/2014, à 23:05

Watael

Re : problème script surveillance dernier fichier

tout à fait.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 29/05/2014, à 23:40

Watael

Re : problème script surveillance dernier fichier

inotifywait -m --format '%w%f : blabla si nécessaire' -e create ./ | stdbuf -oL cat - | while read line; do mail -s inotifyEvent $USER <<<"$line"; done

peut être.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#21 Le 30/05/2014, à 09:02

omnimax

Re : problème script surveillance dernier fichier

merci Watael, pingouinux et postmortem pour toutes vos réponses, entre temps j'avais trouvé ceci qui fonctionne (merci pingouinux pour sed)

#!/bin/bash


empl=$HOME
log=$HOME/Bureau/list
mail=maildudestinataire

while inotifywait -e create "$empl"/* > "$log"
do
list=$(cat "$log" | sed 's/ CREATE//') 
echo -e ""$list" a été ajouté à votre dropbox\n Ceci est un mail automatique" |  msmtp "$mail"}
done
exit 0

mais c'est clair que c'est bien plus joli et court la soluce de postmortem

#!/bin/bash
mail=maildudestinataire
log=$HOME/Dropbox/log
while fic=$(inotifywait -e create $HOME/ --format %w%f)
do
   echo "$fic a été ajouté à votre dropbox\n Ceci est un mail automatique" |  msmtp "$mail"
   ls -l "$fic" > $log # pour garder une trace de l'activité et c'est vrai que -c n'a plus d'intérêt
done
exit 0

Dernière modification par omnimax (Le 30/05/2014, à 09:06)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#22 Le 30/05/2014, à 09:16

Brunod

Re : problème script surveillance dernier fichier

Je n'ai pas tout compris : il ne suffit pas de détecter si il y a au moins un fichier en plus.
Un truc du style
(ls|wc) >mem.txt
puis if (ls|wc) <> cat mem.txt
ne marcherait pas ?


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#23 Le 30/05/2014, à 13:58

Postmortem

Re : problème script surveillance dernier fichier

Salut,

Brunod a écrit :

Je n'ai pas tout compris : il ne suffit pas de détecter si il y a au moins un fichier en plus.
Un truc du style
(ls|wc) >mem.txt
puis if (ls|wc) <> cat mem.txt
ne marcherait pas ?

A ce moment là, il n'y a plus aucun intérêt à utiliser inotifywait alors que ce dernier est fait pour ça.
Et surtout, inotifywait permet de récupérer le nom du fichier créé proprement.
Il peut aussi envoyer des événements sur la suppression ou la modification d'un fichier.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#24 Le 30/05/2014, à 14:18

Brunod

Re : problème script surveillance dernier fichier

Merci !


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#25 Le 02/06/2014, à 11:23

omnimax

Re : problème script surveillance dernier fichier

Salut,

Voilà mon script est fonctionnel mais seulement en local, lorsque je l'exécute via le réseau il me met permission denied.
je l'ai lancé en

sudo ./dropalert 

mais résultat identique.

C'est bizarre car j'ai les droits sur ce réseau puisque je peux créer et supprimer dossiers/fichiers. J'ai consulté le man d'inotifywait mais je n'ai rien vu à ce sujet. 
Vous avez une idée ?

ps : les print$6 et print$7 doivent être ajustés en fonction du chemin réseau.


#!/bin/bash
#dropalert
mail="maildestinataire"
path="/run/user/1000/gvfs/smb-share:server=192.168.1.200,share=data/Clients/IPAD"
while fic=$(inotifywait -e create "$path" -r --format %w%f); do
#sleep 60s
rep=$(awk -F "/" '{print $6}' <<< "$fic") 
fichier=$(awk -F "/" '{print $7}' <<< "$fic") 
txt=$(echo -e "Subject : Un nouveau fichier est apparu sur votre Dropbox !\n\nDans le dossier \e[1m"$rep"\e[21m, il s'agit du fichier : \e[1m"$fichier"\n\n\e[21mCe mail est automatisé.")

echo "$txt" | msmtp "$mail"
done
exit 0

14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne