1. 程式人生 > >傳輸多個檔案中斷,shell指令碼實現續傳

傳輸多個檔案中斷,shell指令碼實現續傳

背景:上篇部落格記錄了本人的需求shell指令碼第一版本,但是傳輸過程中不知道什麼原因中斷了,3000+個數據檔案只成功傳輸了1680個,但是又不能重新啟動之前的指令碼,會出現重複傳輸,也很耗時間。因此就想到從1681個開始傳。

假設 /test/tmpcsv/下面有檔案
……
c_1677.txt
c_1678.txt
c_1679.txt
……
c_1680.txt
c_1681.txt
c_1682.txt
c_1683.txt
……
需要傳輸的是c_1681.txt後面的所有資料檔案

下面是shell指令碼的實現
指令碼名test.sh

for file in /test/tmpcsv/*
do
dir1=${file##*/} #拿掉最後一條 / 及其左邊的字串,對於/test/tmpcsv/*這個路徑, #只保留這個路徑下的所有檔名 dir2=c_1680.txt #指定要對比的檔案 if [ ${dir1} /> ${dir2} ] then ./odpscmd -e "tunnel upload $file 專案名.表名 -dbr true -mbr 100000 threads 10" echo "file "${file}" end" else echo "copleted upload" fi done echo
"all file over"

注意點:shell指令碼中對於空格很是敏感的,=左右是不可以有空格的,
if[ ${dir1} /> ${dir2} ]這句程式碼中的空格是必須要的,不然就會報錯command not found

  • ${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
  • ${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
  • ${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt
  • ${file##*.}:拿掉最後一個 . 及其左邊的字串:txt
  • # 是去掉左邊

另外,由於本人是第一次寫shell指令碼,而且一下子操作的檔案又是上千,所以很多顯示在螢幕上的日誌資訊,也被一次又一次的重新整理了,雖然我在第一版本的shell中,傳輸完成一個檔案的時候進行了列印,但是很不湊巧的是,由於日誌數量太多,打印出的檔案資訊徹底被衝完了。所以一開始也是很懵的,後來還是在odpsclient客戶端的執行記錄中查詢到了。通過執行./odpscmd,並輸入如下命令。

tunnel show history -n 100

針對上述踩過的坑,因此我要把日誌寫入到一個檔案中,方便報錯檢視。

新建一個寫入日誌資訊的檔案,log.txt
在啟動指令碼時,執行如下命令,

./test.sh 2>&1 |tee log.txt

2>&1,表示標準錯誤重定向到標準輸出,如果沒有2>&1,只會有標準輸出,沒有錯誤;tee的作用同時輸出到控制檯和檔案。
./test.sh 2>log.txt 表示只將錯誤寫到檔案,其它的還是在標準輸出。