2011-01-25 10:14

[Shell] 依據遠端清單進行目錄同步

這個任務的狀況是:
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。


檔案下載與錯誤處理:
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。
  1. #!/bin/bash 
  2. # download_file.sh 
  3.  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  5. export PATH 
  6.  
  7. LIMIT=3 # retry 3 times 
  8. LOCAL_PATH=$1 
  9. REMOTE_URL=$2 
  10. FILE_NAME=$3 
  11.  
  12. while [ $LIMIT \> 0 ] ; do 
  13.    #echo $REMOTE_URL/$FILE_NAME 
  14.    rm -f $LOCAL_PATH/$FILE_NAME.tmp 
  15.    curl -f -o $LOCAL_PATH/$FILE_NAME.tmp $REMOTE_URL/$FILE_NAME  > /dev/null 
  16.    if [ "$?" == "0" ]; then 
  17.        mv -f $LOCAL_PATH/$FILE_NAME.tmp $LOCAL_PATH/$FILE_NAME 
  18.        exit 0; 
  19.    fi 
  20.    LIMIT=$(($LIMIT-1)) 
  21. done       
  22.  
  23. exit 1; 


清單比較:
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。
  1. #!/bin/bash 
  2. # folder_sync.sh 
  3.  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  5. export PATH 
  6.  
  7. REMOTE_URL=http://remote_site/pics 
  8. REMOTE_LIST_URL=http://remote_site/pics/file.list 
  9. LOCAL_PATH=/var/www/pics 
  10.  
  11. # get remote list 
  12. REMOTE_LIST=$(curl -f $REMOTE_LIST_URL |tr -d '\r') 
  13. if [ "$?" != "0" ]; then  exit 1; fi 
  14.  
  15. # get local list 
  16. cd $LOCAL_PATH 
  17. LOCAL_LIST=$(ls -1) 
  18. if [ "$?" != "0" ]; then 
  19.    LOCAL_LIST="" 
  20. fi     
  21.  
  22.  
  23. # Check loacl file exists in the list 
  24. for ITEM in  $LOCAL_LIST ; do 
  25.    echo "$REMOTE_LIST" |grep "^$ITEM\$"  > /dev/null 
  26.    if [ "$?" != "0" ]; then 
  27.        # delete old file 
  28.        rm -f $ITEM  &> /dev/null 
  29.    fi 
  30. done 
  31.  
  32. # Check remote file exists in the list 
  33. for ITEM in  $REMOTE_LIST ; do 
  34.    echo "$LOCAL_LIST" |grep "^$ITEM\$"  > /dev/null 
  35.    if [ "$?" != "0" ]; then 
  36.        # download new file 
  37.        download_file.sh $LOCAL_PATH $REMOTE_URL $ITEM &> /dev/null 
  38.    fi 
  39. done 
  40.  
  41. exit 0; 

0 回應: