centos7 自動上傳 transmission 下載完成的文件 到 onedrive腳本


網上都是aria2下載自動上傳onedrive的腳本,苦於搜不到transmission的相關腳本

通過一位大佬的根據剩余空間自動清理transmission種子和數據的腳本,突發靈感

照貓畫虎,初次接觸shell腳本,看不懂的一通亂查,經過多次測試,終於成功了,特分享一下,當然可能 有一些不知道的bug...

當然估計會有更好的方法...

 trans_autoupload.sh

 1 #! /bin/bash
 2 
 3 # transmission遠程 登陸用戶名
 4 USERNAME="***"
 5  
 6 # transmission 遠程 登陸密碼
 7 PASSWORD="***"
 8  
 9 # transmission download 目錄
10 DLDIR="/var/lib/transmission/Downloads"
11 # 上傳到 onedrive 的目錄 
12 RemoteDIR="Study/Bay"  
13 # 日志文件輸出目錄
14 LOG_PATH="/root/log/trans_autoupload.log"
15  # 日期格式化
16 DATA_TIME=$(date +"%y-%m-%d %H:%M:%S")
17  
18 #====================================================================
19 function upFile(){
20     NAME=$@  #因為參數可能帶空格,需要看成一個用$@,否則只能取空格前面的字符串
21     if [[ -e "$DLDIR/$NAME" ]]; then #判斷文件是否存在
22            #判斷文件所在目錄絕對路徑(dirname)是否等於 $DLDIR
23         if [[ $(dirname "$DLDIR/$NAME") == $(readlink -f $DLDIR) ]]; then
24               #等於的話,執行的命令
25               echo "$NAME 是文件"
26         #判斷是否存在上傳成功的標記文件
27               if [[ -e "$DLDIR/$NAME.isupload" ]];then
28                   echo "已上傳"
29                   return 
30               fi
31               echo "還未上傳..上傳中.."
32         #echo $RemoteDIR "---" \""$DLDIR/$NAME"\"
33               eval "onedrive -f $RemoteDIR" \'"$DLDIR/$NAME"\' #這里使用 eval 后面指令,注意后面地址/文件名可能有空格,$DLDIR/$NAME需要加上'  ' ,用到了 轉義  \'  \'
34             if [[ $? == '0' ]]; then
35                 cd "$DLDIR"
36                 touch "$NAME.isupload" #上傳成功后創建標記文件,供下次腳本運行判斷
37             echo $DATA_TIME $NAME "上傳成功" >> $LOG_PATH 2>&1
38               fi
39         else
40             Folder=${NAME%%/*}
41             echo "$Folder 是文件夾"
42             if [[ -e "$DLDIR/$Folder.isupload" ]];then
43                   echo "已上傳"
44                   return 
45               fi
46               echo "還未上傳...上傳中..."
47         #echo \"$DLDIR/$Folder\"
48               eval "onedrive-d -f $RemoteDIR" \'"$DLDIR/$Folder"\'
49             if [[ $? == '0' ]]; then
50                 cd "$DLDIR"
51                 touch "$Folder.isupload";
52             echo $DATA_TIME $Folder "上傳成功" >> $LOG_PATH 2>&1
53               fi
54         fi
55        fi       
56 }
57 function Start(){
58 for i in `transmission-remote --auth $USERNAME:$PASSWORD -l | grep 100% | grep Done | awk '{print $1}' | grep -v ID`
59     do
60         echo $DATA_TIME  "$i"
61         transmission-remote --auth $USERNAME:$PASSWORD -t $i -f |grep -v '#'|grep 100% | awk '{for (i=2; i<7; i++){$i=""} print $0}'|while read ID NAME
62           do
63             #echo $DLDIR/$NAME
64               upFile $NAME #把獲取的$NAME傳給 upFile函數
65             break;
66            done
67     done
68 }
69 Start

 

其中:

transmission-remote --auth $USERNAME:$PASSWORD -l | grep 100% | grep Done | awk '{print $1}' | grep -v ID
  transmission-remote --auth $USERNAME:$PASSWORD -l  是獲取transmission的所有種子列表,如下:列表

 

 
        

ID Done Have ETA Up Down Ratio Status Name

67 100% 1.05 GB Done 0.0 0.0 4.9 Idle 1080.mp4
68

69
Sum: 22.43 GB 4350.0 830.0

 

  | grep 100% | grep Done | 篩選出進度100%的的那一行

  |grep -v ID   不選中ID的行 ,實際上面的命令就以及排除了ID的那一行和sum那一行
     | awk '{print $1}'   以空格為分隔,分為N列,$1是取第一列

  最后就獲取了所有完成的種子的  ID

 

 

transmission-remote --auth $USERNAME:$PASSWORD -t $i -f |grep -v '#'|grep 100% | awk '{for (i=2; i<7; i++){$i=""} print $0}'|while read ID NAME
  -t 種子ID -f  獲取的是次ID種子的所有文件信息,如下

liu lang di qiu.mp4 (1 files):
# Done Priority Get Size Name
0: 100% Normal Yes 2.46 GB liu lang di qiu.mp4

   ps:種子文件可能是文件夾包含多個文件的,里面的文件就不止一個了,Name也變成了 文件夾/文件名的格式

  同理篩選  出只有信息的那一行,(其實一個grep 100%就搞定了),

  |awk 命令的意思是,從第2列到第6列(還是以空格分1是0: 2是100% 3是Normal 4是Yes 5是2.46  6是GB   7是liu)賦值為空,然后$0是取所有,

    發現awk會把含空格的文件名分開來,這里用for in的話文件名就獲取不到了,這里找解決方案找了很久,終於發現用

  |while read ID NAME  就解決了  同樣以空格分隔,第一個空格前 讀到ID變量,后面的都讀到NAME變量里面,這樣就獲取了所有的文件名

  下面就是用 onedrive 文件  和 onedrive-d 文件夾 命令 上傳就行了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM