传输多个文件中断,shell脚本实现续传

xiaoxiao2021-02-28  54

背景:上篇博客记录了本人的需求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 表示只将错误写到文件,其它的还是在标准输出。

转载请注明原文地址: https://www.6miu.com/read-1700318.html

最新回复(0)