网上都是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 文件夹 命令 上传就行了