2011-04-13 37 views
0

Shell新手在這裏。我不知道我正在做什麼是一個很好的方法來解決這個問題。shell編程幫助 - 做unix diff的最好方法並報告任何區別

基本上這就是我想做的事:

  1. 創建當前目錄列表(curr.lst)
  2. 做的curr.lst和舊列表中的DIFF(before.lst )

  3. 如果沒有差別,則確定沒有變化,改變curr.lst到before.lst爲下一次運行

  4. 如果存在的diff.lst大於0字節(意思是有一個變化,然後d東西,郵寄更改列表等

反正, 我的邏輯是不完全正確的。這可能是我使用if語句。

我在尋找幫助來調整我的邏輯,更好的編碼實踐來完成這個簡單的任務。真的,我想要做的就是每天運行這個腳本,並檢查舊的和新的是否有變化,如果有變化,我想知道。

感謝您的任何意見,建議,例子。

#!/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 

回答

1

一件事,我看到的是,你已經執行$CHKSZ在你的腳本的第9行(RESP du -k ...)。反引號中的命令立即執行。

第二個問題可能是您使用du -k,它以千比特打印大小。如果只有很小的變化,你可能會得到0的大小。我想你最好使用du -b來獲取以字節爲單位的大小(如果你想這樣做)。

+0

@ bmk-是的,那是什麼讓我失望。現在我明白了爲什麼我得到那個'du'錯誤,想爲什麼它甚至被執行。我如何構造這個命令而不執行?雙引號?再次感謝。 – jdamae 2011-04-13 20:55:15

+0

@jdamae:其實我不會像使用'$ CHKSZ'變量那樣構造命令。有可能使用雙引號並刪除反引號。但是你必須使用'eval'來執行它(可能會有副作用)。我會用例如'$ CHKSZ #run檢查文件大小'這行代替。 'SIZE = $(du -k「$ BASE/$ DIFFOUT」| cut -f 1)'並稍後使用'$ SIZE'的內容。 – bmk 2011-04-13 21:06:09

+0

好的,謝謝。所以如果稍後檢查'SIZE',如果[$ SIZE == 0]這樣做是正確的。那麼......'? – jdamae 2011-04-13 21:10:14

0

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