2016-12-21 2 views
1

Я создаю скрипт bash в файле для отправки diff по почте.Как сравнить тот же файл и отправить почту в linux

для ниже случае, я создал два файл "xyz.conf" и "xyz.conf_bkp" для сравнения До сих пор, я пришел с ниже сценарием -

file="https://stackoverflow.com/a/b/c/xyz.conf" 

while true 
do 
    sleep 1 
    cmp -s $file ${file}_bkp 
     if [ $? > 0 ]; then 
      diff $file ${file}_bkp > compare.log 
      mailx -s "file compare" [email protected] < compare.log 
      sleep 2 
      cp $file ${file}_bkp 
      exit 
     fi 
done 

я запланировал выше скрипт для запуска каждого второго

* * * * 0-5 script.sh 

Это работает нормально, но я ищу с другим подходом, как показано ниже - Я ищу для работы без создания другого резервного файла Представьте себе, если мне нужно будет работать с несколькими файлами, которые приведут меня к тому, чтобы выставить много резервных копий, которые не выглядят хорошо.

Может ли кто-нибудь предложить, как реализовать этот подход?

+0

использовать трубу ..... –

+0

Резервное копирование кажется необходимым, если вам нужно что-то сравнить, возможно, с измененным файлом. Это 'compare.log', что вы хотите избежать создания? – chepner

+0

Привет @chepner, compare.log Я использую, чтобы отправить diff мне по почте. мы можем избежать этого и отправлять diff непосредственно в почту вместо записи в файл. Но если найдутся много различий, тогда будет сложно отправить столько diff o/p без использования файла. Дайте мне знать, если возможно – Kshitij8097

ответ

0

Я бы написал его таким образом.

while cmp "$file" "${file}_bkp"; do 
    sleep 2 
done 
diff "$file" "${file}_bkp" | mailx -s "file compare" [email protected] 
cp "$file" "${file}_bkp" 

Я хотел, чтобы избежать запуска как cmp и diff, но я не уверен, что это возможно без временного файла или трубы для хранения данных от diff, пока не определите, если mailx должен работать.

while diff "$file" "${file}_bkp"; do 
    sleep 2 
done | { 
    mailx -s "file compare" [email protected] 
    cp "$file" "${file}_bkp" 
    exit 
} 

diff не будет производить никакого вывода, когда его статус выхода равен 0, так что, когда она, наконец, имеет ненулевое состояние выхода его выход по конвейеру (как на выходе из контура while) к составная команда, которая запускает mailx и cp. Технически, оба mailx и cp могут оба читать из трубы, но mailx исчерпывает все данные до cp, и эта команда cp будет игнорировать ее стандартный ввод.

+0

здесь, почему я использовал «выход», как только он нашел разницу, он должен выйти из цикла, поэтому я использовал exit в «if loop» "only – Kshitij8097

+0

В этом случае вы можете удалить внешний цикл и' sleep 1'; код останется во внутреннем цикле, пока 'diff' не найдет разницу. – chepner

+0

Привет @chepner, выше сценария продолжает посылать мне поток писем с тем же самым изменением. – Kshitij8097

Смежные вопросы