[BAT脚本]把远程linux服务器上的大量文件按相同目录结构下载到本地windows

场景:远程linux服务器上有一个大小为600G的文件夹,里面包含130万个小文件,并且服务器上没有足够的空间可以生成这个文件夹的压缩文件。因而考虑使用ftp以批量化的方式把文件逐个下载。

处理思路:

1.先使用get_dir_list.sh得到linux服务器上目标文件夹下所有的目录结构,生成的目录数据保存在:all_dir_name.log

#!/bin/sh

src_dir=""

function getdir(){
    for element in `ls $1`
    do
        dir_or_file=$1"/"$element
        if [ -d ${dir_or_file} ]
        then
            echo ${dir_or_file}
            getdir ${dir_or_file}
#        else
#            echo ${dir_or_file}
        fi
    done
}

getdir ${src_dir} > /tmp/all_dir_name.log

2.把all_dir_name.log下载到本地linux,使用脚本:crt_dir_list.sh 创建出一个一样的目录结构。作用:这里创建的空目录,用于后面把远程对应目录下的文件下载过来。

#!/bin/sh

src_file=all_dir_name.log
new_dir_pre="/tmp/newdir"

while read dir_path
do
  #echo "line=["${dir_path}"]"
  new_path=${new_dir_pre}${dir_path}
  #echo "newline=["${new_path}"]"
  mkdir -p ${new_path}
done < ${src_file}

 

3.把本地创建好的空目录打成tar包拷贝到目标windows机器上,并解压目录

4.在windows机器上,利用脚本get_linux_file.bat,把远程linux服务器上的文件下载到本地对应目录中

@echo off
setlocal enabledelayedexpansion

set ftpUser=username

set ftpPass=password

set ftpIP=10.201.65.235

rem Attention:
rem Remote linux path must be ended with "/", like: /tmp/xxx/
rem Local windows path can not end with "/", like: C:/temp/xxxx
rem You have better edit path.log with Editor:"writing board" to avolid formate problem.
for /f "tokens=1-2 delims=," %%i in (local_linux_ftp_path1.log) do (
echo %%i
echo %%j

>"C:/temp/TempFTP.txt" (
echo,%ftpUser%
echo,%ftpPass%
echo cd "%%i"
echo lcd "%%j"
echo bin
echo mget *.*
echo bye
)

rem Attention:
rem Don't use "start" command to create a new window
ftp -v -i -s:"C:/temp/TempFTP.txt" %ftpIP%

rem Avolid multiple ftp process when use: start ftp 
:start
set a=0
for /f %%i in ('tasklist ^|findstr /i "ftp.exe"') do (
set /a a+=1
)

echo !a!

if !a! GEQ 1 (
echo CurrentDir=%%i
ping -n 3 127.0.0.1>nul
set a=0
goto start
)

del C:\temp\TempFTP.txt
)

rem src.txt每行的格式:
远程linux文件存放路径,本地windows保存路径

 

附:

windows读文件bat脚本:

@echo off

rem 设置本地延迟环境变量扩展
setlocal enabledelayedexpansion
rem tokens表示要取哪几个域
rem delims表示行内容的分隔符
rem 利用set来把拆分后的行内容保存在变量中
for /f "tokens=1-3 delims=," %%i in (src.txt) do (
set BL1=%%i
set BL2=%%j
set BL3=%%k
rem 在延迟变量扩展中,要使用!来引用变量
echo 变量一=!BL1!   变量二=!BL2!   变量三=!BL3!)

rem src.txt的内容为:
12,ww,qeq
22,rtyyy,aaa
65,ppo,lolo

src.txt生成脚本:

#!/bin/sh

linux_path=xxx.log
windows_path=xxx.log

dest_log_file=xxx.log

#sum_line=`wc -l ${linux_path}`
#sum_line=`expr ${sum_line} + 1`
                
cnt=1

# clear log file
> ${dest_log_file}
       
#linux_line=`sed -n "${cnt}p" ${linux_path}`
#echo "line_line="${linux_line}
 
#while [ ${cnt} -lt ${sum_line} ]
while [ ${cnt} -le 4912 ]
do             
        linux_line=`sed -n "${cnt}p" ${linux_path}`
        windows_line=`sed -n "${cnt}p" ${windows_path}`
               
        echo ${linux_line}","${windows_line} >> ${dest_log_file}

        cnt=`expr ${cnt} + 1`
done

 

 

Leave a Reply

Your email address will not be published.