2010-11-19 24 views
5

Je veux regarder toutes les modifications apportées à un fichier xyz.txt et écrivez-moi le fichier en entier quand il y a un changement. Y a-t-il One Liner (ou un script shell de quelques lignes) pour cela?Regarder un fichier pour le changement

Mise à jour:

# Check if my.cnf has been changed in the last 24 hours 
# if yes, as in the following case, simply send the file 
# if it has not been changed in the last 24 hours, do nothing. 

# find /etc/ -name my.cnf -mtime 0 
/etc/my.cnf 

# cat /etc/my.cnf | mail [email protected] 

Maintenant, si quelqu'un peut montrer comment lier ces deux lignes dans un script shell ou dans 1 commande.

Répondre

4

pour cette solution:

find /etc/ -name my.cnf -mtime 0 -exec sh -c 'cat {} | mail -E -s "file changed" [email protected]' \; 

L'option -E-mail empêche d'envoyer des messages avec des corps vides (comme ce serait le cas si find ne renvoie rien et cat rien sorties

+0

option -e ne semble pas être disponible pour ma version de commande mail – shantanuo

+1

@shantanuo: Voici une question sur Super User à propos de [tuyauterie uniquement lorsque la sortie est non vide ] (http://superuser.com/q/210054/310). –

6

Vous devriez regarder dans inotify qui peut regarder un fichier ou un répertoire et signaler les changements.

+0

+1 pour le lien – GuruM

18

Vous pouvez utiliser inotifywait. Il attend les modifications apportées à un fichier, puis exécute une commande (par exemple, quelque chose comme msmtp dans votre cas).

-2
#!/bin/ksh 

ls -lt /usr/tip30/prtfile/asb270.prt|awk '{print $6$7$8}'|awk -F: '{print $1$2}' 
> /tmp/lastupdated.temp 
read input_pid < /tmp/lastupdated.temp 
echo "$input_pid" 

while [ "$input_pid" -eq "`ls -lt /usr/tip30/prtfile/asb270.prt | awk '{print $6 
$7$8}'|awk -F: '{print $1$2}'`" ]; do 
    echo "file has not changed " 
    sleep 30 
done 
echo "file changed `ls -lt /tmp/lastupdated.temp`" 
rm /tmp/lastupdated.temp 
+1

Veuillez formater votre code/fournir une explication pour résoudre le problème. –

1
.

inotify-hookable est un script perl qui est assez facile à utiliser à cette fin, par exemple,

inotify-hookable -f /path/to/file -c "latexmk -pdf /path/to/file" & 
inotify-hookable -f /path/to/file -c "cp /path/to/file /path/to/copy" & 

-f pour le fichier à regarder -c pour exécuter une commande

je l'avais regarder un fichier sur un ordinateur distant aussi, mais inotify-accrochable fini quand a été supprimé le fichier regardé avant d'être actualisé.

Je l'ai installé depuis Debian. lien CPAN: https://metacpan.org/pod/App::Inotify::Hookable