Смотреть файл для изменения - PullRequest
7 голосов
/ 19 ноября 2010

Я хочу посмотреть любые изменения в файле xyz.txt и отправить мне по электронной почте весь файл всякий раз, когда есть изменения.Есть ли для этого один вкладыш (или сценарий с несколькими строками)?

Обновление:

# 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 shantanu@company.com

Теперь, если кто-то может показать, как связать эти две строки всценарий оболочки или 1 команда.

Ответы [ 6 ]

22 голосов
/ 19 ноября 2010

Вы можете использовать inotifywait.Он ожидает изменений в файле, а затем выполняет команду (например, что-то вроде msmtp в вашем случае).

8 голосов
/ 19 ноября 2010

Вы должны посмотреть на inotify , который может просматривать файл или каталог и сообщать об изменениях.

4 голосов
/ 19 ноября 2010

Попробуйте:

find /etc/ -name my.cnf -mtime 0 -exec sh -c 'cat {} | mail -E -s "file changed" shantanu@company.com' \;

Опция -E для mail запрещает отправку сообщений с пустыми телами (как в случае, если find ничего не возвращает и cat ничего не выводит.

2 голосов
/ 13 февраля 2015

inotify-hookable - это Perl-скрипт, который довольно прост в использовании для этой цели. Например,

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 для файла для просмотра -c для запуска команды

Я тоже смотрел файл на удаленном компьютере, но перехватывался inotify, когда просматриваемый файл был удален до обновления.

Я установил его из Debian. CPAN ссылка: https://metacpan.org/pod/App::Inotify::Hookable

1 голос
/ 09 мая 2018

Как я узнал от другой вопрос у суперпользователя (все заслуги там):

entr (http://entrproject.org/) обеспечивает более дружественный интерфейс для inotify (а также поддерживает * BSD и Mac OS X).

Это наблюдает за данным файлом (или файлами) на предмет изменений и запускает команду всякий раз (в момент), когда она изменяется. Так что вы можете сделать это так:

echo /etc/my.cnf | \
  entr sh -c 'cat /etc/my.cnf | mail -E -s "file changed" shantanu@company.com'

(PS. Кредит Денис для почтовой команды)

0 голосов
/ 29 октября 2013
#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...