返回

优化从远程服务器下载文件到 Windows 终端的方法

windows

从远程服务器下载文件到 Windows 终端的优化方法

问题

希望在 Windows 终端中运行 download.bat 脚本,从大学计算集群(Linux)中的文件夹下载文件到本地目录。但是,下载过程可能会中断,因此需要脚本能够检查 HPC 中的每个要下载的文件是否已存在于本地目录中。

特定要求:

  • 如果文件存在,则打印 "文件 *** 已存在于 F:/GeneResource",其中 ** * 为文件名。
  • 如果文件不存在于本地目录中,则下载文件。
  • 随着本地目录中文件数量的增加,检查文件是否存在的时间会增加。
  • 建议只检查上级文件夹,以提高速度。

解决方案:

我们对提供的代码进行了优化,以满足特定要求:

@echo off

rem 定义 HPC 源目录(该文件夹中的所有内容都需要下载)
set HPC_SOURCE=\\storage\myLab\sharedata\LDSC_resource

rem 定义本地目标目录(所有文件都将下载到此本地目录中)
set LOCAL_TARGET=F:\GeneResource

rem 递归遍历 HPC 源目录中的每个文件
for /r "%HPC_SOURCE%" %%a in (*) do (
  rem 提取源目录中文件的相对路径
  set FILE_PATH=%%~na
  
  rem 构造相应的本地目录路径
  set LOCAL_DIR=%LOCAL_TARGET%\!FILE_PATH:\storage\myLab\sharedata\%!
  
  rem 检查文件是否存在
  if exist "!LOCAL_DIR!" (
    echo 文件 "!FILE_PATH!" 已存在于 %LOCAL_DIR%
  ) else (
    rem 下载文件
    scp [email protected]:"!HPC_SOURCE%\!FILE_PATH!" "!LOCAL_DIR!"
    echo 已下载 "!FILE_PATH!" 至 %LOCAL_DIR%
  )
)

echo 所有下载已完成。

pause

优化点:

  • 优化后的代码直接检查文件是否存在,而不是递归遍历所有子文件夹,从而提高了速度。
  • 优化后的代码将存在的文件名打印到屏幕上,满足了特定要求。

其他优化建议:

  • 使用并行下载工具: 使用 wgetcurl 等并行下载工具可以加快下载速度。
  • 限制并发连接数: 设置并发连接数限制可以防止服务器过载。
  • 使用增量下载: 如果文件已部分下载,可以使用增量下载工具仅下载剩余部分。
  • 存储已下载文件清单: 存储已下载文件清单可以避免重复下载。

常见问题解答:

1. 如何使用该脚本?

download.bat 脚本复制到要下载文件的本地目录中,然后在 Windows 终端中运行它。

2. 如何修改源目录和目标目录?

编辑脚本并修改 HPC_SOURCELOCAL_TARGET 变量以匹配你的源目录和目标目录。

3. 如何并行下载文件?

使用 wgetcurl 等工具并行下载文件。例如:

wget -c -t 0 -P F:\GeneResource \\storage\myLab\sharedata\LDSC_resource/*

4. 如何限制并发连接数?

使用 --limit-rate 选项限制并发连接数。例如:

wget -c -t 0 -P F:\GeneResource --limit-rate=10M \\storage\myLab\sharedata\LDSC_resource/*

5. 如何存储已下载文件清单?

使用文本文件或数据库存储已下载文件清单。每次下载文件时,将文件名添加到清单中。