2011-03-11 144 views
1

尋找一些幫助我的bash腳本。我試圖寫這個shell腳本執行以下操作:幫助shell腳本根據條件查找和移動文件

  1. 找到一個名爲DIR文件: server1-date.done server2-date.done server3-date.done ... server10-date.done

  2. 打印到listA

  3. 在dir(* .gz)中查找文件並打印到listB
  4. 如果listA10計數(發現基本上10個.done文件),然後 入手移動從listB文件後,在listB將文件移動到新目錄
  5. ,然後刪除舊的目錄,其名稱類似(server1-date,server2-date,...)和.done文件。

到目前爲止,我已經在作品中了。我無法獲得if部分工作的條件。我認爲我沒有正確編碼。任何代碼建議,改進等,將不勝感激。謝謝。

#Directories 
GZDIR=/mydumps/mytest 
FINALDIR=/mydumps/mytest/final 
FLGDIR=/backup/mytest/flags 
export GZDIR FINALDIR FLGDIR 

#lists 
FLGLIST="/mydumps/mytest/lists/userflgs.lst" 
GZLIST="/mydumps/mytest/lists/gzfiles.lst" 
export FLGLIST GZLIST 

#Find files 
find $FLGDIR -name \*.done -print > $FLGLIST 
find $GZDIR -name \*.gz -print > $GZLIST 

#Get need all (10) flags found before we do the move 
FLG_VAL =`cat $FLGLIST | wc -l` 
export $FLG_VAL 

if [ "$FLG_VAL" = "10" ]; then 
    for FILE in $GZLIST 
     do 
     echo "mv $GZLIST $FINALDIR" 2>&1 
      for FLAG in $FLGLIST 
      do 
      echo "rmdir -f $FLAG" 2>&1 
      done 
     done 
     else 
      echo "Cannot move file" 2>&1 
     exit 0 
fi 
+0

'$出口是FLG_VAL'都完全沒有必要的,而且也很可能沒有做任何事情,甚至接近到什麼你認爲它在做。 – Omnifarious 2011-03-11 23:47:43

+0

不需要導出任何這些變量(或間接地,它們的內容)。 – 2011-03-12 04:38:40

+0

有沒有辦法在執行之前檢查所有語法? – jdamae 2011-03-12 22:59:16

回答

2

我不知道這是否會工作,但它會解決所有明顯的問題:

#!/bin/sh 
#Directories 
GZDIR=/mydumps/mytest 
FINALDIR=/mydumps/mytest/final 
FLGDIR=/backup/mytest/flags 
export GZDIR FINALDIR FLGDIR 

#lists 
FLGLIST="/mydumps/mytest/lists/userflgs.lst" 
GZLIST="/mydumps/mytest/lists/gzfiles.lst" 

#Find files 
find "$FLGDIR" -name '*.done' -print > "$FLGLIST" 
find "$GZDIR" -name '*.gz' -print > "$GZLIST" 

#Get need all (10) flags found before we do the move 
FLG_VAL=$(wc -l <"$FLGLIST") # Always prefer $(...) to backticks. 

if [ "$FLG_VAL" -ge 10 ]; then 
    for FILE in $(cat "$GZLIST") 
     do 
     echo "mv $FILE $FINALDIR" 2>&1 
    done 
    for FLAG in $(cat "$FLGLIST") 
     do 
     echo "rmdir -f $FLAG" 2>&1 
    done 
else 
    echo "Cannot move file" 2>&1 
    exit 0 
fi 
+0

感謝您的清理。我得到它沒有錯誤的工作。 – jdamae 2011-03-12 00:04:24

+0

我必須刪除'.done'標誌和目錄:'rm -f/mydumps/mytest/flags/server1-20110311.done'和'rmdir -f/mydumps/mytest/flags/server1-20110311'。我可以在相同的循環中執行此操作嗎? – jdamae 2011-03-12 00:11:55

+0

@jdamae - 是的,你可以。 :-)這不是很難,我會​​準確地留下如何去做,讓你迷惑一段時間。 – Omnifarious 2011-03-12 00:35:44

1
FLG_VAL =`cat $FLGLIST | wc -l` 

應該是:

FLG_VAL=`cat $FLGLIST | wc -l` 
+0

更好:'FLG_VAL = $(wc -l <​​「$ FLGLIST」)' – 2011-03-12 04:36:45

2

首先,我真的建議你作爲默認的態度總是test for exceptions,並且不包括測試,除非這裏面的「正常」的情況下,是必要的。

... 
FLG_VAL=`wc -l < $FLGLIST`    # no need for cat, and no space before '=' 
export $FLG_VAL 

if [ "$FLG_VAL" != "10" ]; then 
     echo "Cannot move file" 2>&1 
     exit 0 
fi 

for FILE in $GZLIST 
do 
    echo "mv $GZLIST $FINALDIR" 2>&1 
    for FLAG in $FLGLIST 
    do 
     echo "rmdir -f $FLAG" 2>&1 
    done 
done 

查看代碼現在讀取多少容易,錯誤檢查被提取並自行維護?

+0

是的,謝謝你的建議。一直在尋找最佳實踐。 – jdamae 2011-03-12 00:03:39