Справка по программированию оболочки - лучший способ сделать разницу в Unix и сообщить о любых различиях - PullRequest
0 голосов
/ 14 апреля 2011

Оболочка новичка здесь. Я не уверен, что то, что я делаю, - хороший способ сделать это.

В основном это то, что я хочу сделать:

  1. создать список текущих каталогов (curr.lst)
  2. сделать различие с curr.lst и старым списком (before.lst)

  3. если нет никакой разницы, тогда без изменений, замените curr.lst на before.lst для следующего запуска

  4. если там diff.lst больше 0 байтов (то есть изменение есть, сделать что-то, отправить список изменений по почте и т. Д.)

В любом случае, Моя логика не совсем верна. Это может быть мое использование if statments.

Мне нужна помощь, чтобы настроить свою логику, улучшить практику кодирования для выполнения этой простой задачи. На самом деле все, что я хочу сделать - это запускать этот скрипт ежедневно и проверять, есть ли изменения между старым и новым, если есть изменения, я хочу знать.

Спасибо за любой вклад, предложения, примеры.

#!/usr/local/bin/bash
STAGE=/myproj/foo/proc
BASE=/dev/testing/scripts

BEFORE="$BASE/before.lst"
CURR="$BASE/curr.lst"
DIFFOUT="diff.out"

CHKSZ=`du -k "$BASE/$DIFFOUT" | cut -f 1`

#MAIN
if [ -f $BEFORE ]; then #if we find a previous file to compare enter main loop, if not get out
          chmod 755 $BEFORE
          echo "old list exists"  2>&1
          echo "get the new list and do a diff"  2>&1
          ls "$STAGE" | perl -nle 'print $1 if m|$STAGE/(\S+)|' > "$CURR" #creates a file curr.lst

          #if curr.lst exists then do the diff
          if [ -f $CURR ]; then
             diff -b -i $BEFORE $CURR >> $BASE/$DIFFOUT 2>&1 #create file diff.out
          else
             echo "command did not work, no diff.out file to compare, exiting..." 2>&1
          exit 0
          fi

          #if file diff.out exists, check its file size, if its greater than 0 bytes then not good 
          if [ -f $BASE/$DIFFOUT ]; then
              echo "diff.out exists, how big is it?" 2>&1
              chmod 755 $BASE/$DIFFOUT
              $CHKSZ #run check on file size
          else
              echo "Could not find diff.out" 2>&1
          exit 0
          fi

          if [ $CHKSZ == "0" ]; then
                echo "no changes to report" 2>&1
                rm $BASE/$DIFFOUT #Cleanup the diff since there's notthing to report
                mv $CURR $BEFORE #change curr.lst to before.lst to compare next time
          else
                echo "Detected a change" 2>&1
                echo "Report it" 2>&1
          exit 0
          fi
else
echo "No before file to compare" 2>&1
exit 0
fi

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Я вижу, что вы уже выполняете $CHKSZ (соответственно du -k ...) в строке 9 вашего скрипта. Команда в кавычках выполняется немедленно.

Вторая проблема может заключаться в том, что вы используете du -k, который печатает размер в килобайтах. Если есть только незначительные изменения, вы можете получить размер 0. Я думаю, вам лучше использовать du -b, чтобы получить размер в байтах (если вы хотите сделать это таким образом).

0 голосов
/ 14 апреля 2011

со страницы руководства diff(1):

DIAGNOSTICS
       An  exit status of 0 means no differences were found, 1 means some dif-
       ferences were found, and 2 means trouble.
if ! diff -b -i "$BEFORE" "$CURR" &> /dev/null
then
  echo "Changes were found, or an error happened"
else
  echo "No changes found"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...