您的位置:首页 > 运维架构 > Shell

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

2018-03-06 16:27 295 查看
背景:上篇博客记录了本人的需求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 表示只将错误写到文件,其它的还是在标准输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: