Shell新手在這裏。我不知道我正在做什麼是一個很好的方法來解決這個問題。shell編程幫助 - 做unix diff的最好方法並報告任何區別
基本上這就是我想做的事:
- 創建當前目錄列表(curr.lst)
做的curr.lst和舊列表中的DIFF(before.lst )
如果沒有差別,則確定沒有變化,改變curr.lst到before.lst爲下一次運行
- 如果存在的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
@ bmk-是的,那是什麼讓我失望。現在我明白了爲什麼我得到那個'du'錯誤,想爲什麼它甚至被執行。我如何構造這個命令而不執行?雙引號?再次感謝。 – jdamae 2011-04-13 20:55:15
@jdamae:其實我不會像使用'$ CHKSZ'變量那樣構造命令。有可能使用雙引號並刪除反引號。但是你必須使用'eval'來執行它(可能會有副作用)。我會用例如'$ CHKSZ #run檢查文件大小'這行代替。 'SIZE = $(du -k「$ BASE/$ DIFFOUT」| cut -f 1)'並稍後使用'$ SIZE'的內容。 – bmk 2011-04-13 21:06:09
好的,謝謝。所以如果稍後檢查'SIZE',如果[$ SIZE == 0]這樣做是正確的。那麼......'? – jdamae 2011-04-13 21:10:14