sftp批量下载shell脚本

shell 实现ftp批量下载

脚本代码如下

#!/bin/bash
#删除之前一天的数据
function my_delete(){
cd ${SRCDIR}
ls | xargs -P 0 rm -f
}
#下载文件的函数
function my_download(){
#用户名
USER=用户名
#密码
PASSWORD=密码
#FTP目录(待下载文件目录)
DESDIR=目录
serverIp=IP地址
#端口
PORT=22
concurrency=100
fifoFile="/tmp/$$.fifo"
fd=8
# 创建命名管道
mkfifo $fifoFile
trap "exec 8>&-; rm $fifoFile" EXIT

# 创建文件描述符并和文件关联
# 测试过程中发现这里不能用$fd, 就要写上具体数字 
exec 8<>"$fifoFile"

for i in `seq $concurrency`; do
	echo >& $fd
done
nameStr=`lftp -u ${USER},${PASSWORD} sftp://${serverIp}:${PORT}<<EOF
cd ${DESDIR}
lcd ${SRCDIR}
nlist
by
EOF`
#字符串转数组
array=(${nameStr// / }) #3696
#遍历所有的文件目录
for(( i=2;i<1000;i++)) 
do
  # 一个read -u6命令执行一次,就从fd中减去一个回车符,然后向下执行,
    # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
read -u $fd
{
`lftp -u ${USER},${PASSWORD} sftp://${serverIp}:${PORT}<<EOF
cd ${DESDIR}/${array[i]}
lcd ${SRCDIR}
#下载mrs的文件 
 mget  *MRO*
by
EOF`
echo >& $fd
}&
done
wait
}
#解压文件的函数
function my_unzip(){
#递归解压文件
cd  ${SRCDIR}
#解压文件批量 5000每次解压文件的数量
find . -type f -name "*.gz"| xargs -P 50 -n 50 gzip -d
}
#删除文件大小是0的文件
function delete_size0(){
cd ${SRCDIR}
find . -name "*" -type f -size 0c | xargs -P 100 -n 200 rm -f
}
#删除文件大小是227不参与计算的文件
function delete_size227(){
cd ${SRCDIR}
find . -name "*" -type f -size +1c -size -1800c | xargs -n 100 rm -f
}
#执行函数
#获取前一天的时间
DATETIME=$(date -d "yesterday" +%Y%m%d)
#下载文件目录
SRCDIR=要下载到的目录
#清空文件夹
my_delete $SRCDIR
#下载文件
my_download $DATETIME $SRCDIR
#删除无用的文件大小是0
delete_size0 $SRCDIR
 #解压文件
my_unzip $SRCDIR $LOG
 #删除不参与计算的文件
 delete_size227 $SRCDIR
 echo "文件下载完成!"



版权声明:本文为weixin_43369631原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。