我希望在Windows终端中运行
download.bat
来执行名为“download.bat”的文件,将大学计算集群(Linux)帐户中的文件夹中的文件下载到我的本地目录。
考虑到下载可能会不时因未知原因而中断,我希望“download.bat”检查HPC中要下载的每个文件是否已存在于我的本地目录中。如果存在,则打印“File ***已经存在于F:/GeneResource”,其中***为文件名。如果本地目录不存在该文件,则下载该文件。
注意事项: 有一个警告需要注意。随着文件下载过程中本地目录中文件数量的增加,检查本地目录中是否存在HPC中的文件所需的时间会越来越长。我有一个加快速度的建议。当文件下载到本地目录时,该文件与HPC中的父目录位于同一父目录中,因此只需在该文件所在的直接子文件夹中进行检查即可。例如,要检查文件 /storage/myLab/sharedata/LDSC_resource/LDSC_SEG_ldscores/Corces_ATAC.ldcts 是否存在于本地目录中,只需检查文件夹 F:/GeneResource/LDSC_resource/LDSC_SEG_ldscores 即可。无需检查其他子文件夹。因此用于检查的本地目录中的文件夹路径应该是HPC中文件的路径,将“/storage/myLab/sharedata/”替换为“F:/GeneResource/”。这减少了不必要的检查,因此会节省一些时间。如果您有其他聪明的想法来加快速度,谢谢!
以下脚本由 Gemini 生成,执行时返回“所有下载已完成”。即使之前的下载不完整。请帮助我更新此代码,或者如果此脚本完全无法使用,请编写一个新代码,以在解决警告的同时实现该功能。
@echo off
rem Define the HPC source directory (Everything in this folder needs to be downloaded)
set HPC_SOURCE=\\storage\myLab\sharedata\LDSC_resource
rem Define the local target directory (All files will be downloaded into this local directory)
set LOCAL_TARGET=F:\GeneResource
rem Loop through each file in the HPC source directory recursively
for /r "%HPC_SOURCE%" %%a in (*) do (
rem Extract the relative path of the file within the source directory
set FILE_PATH=%%~na
rem Construct the corresponding local directory path
set LOCAL_DIR=%LOCAL_TARGET%\!FILE_PATH:\storage\myLab\sharedata\%!
rem Check if the file already exists in the local directory
if exist "!LOCAL_DIR!" (
echo File "!FILE_PATH!" already exists in %LOCAL_DIR%
) else (
rem Download the file if it doesn't exist locally
scp [email protected]:"!HPC_SOURCE%\!FILE_PATH!" "!LOCAL_DIR!"
echo Downloaded "!FILE_PATH!" to %LOCAL_DIR%
)
)
echo All downloads completed.
pause
请注意,上述脚本要写入“download.bat”文件中,以便在 Windows 终端运行,而不是 Linux。
脚本错误地处理文件路径提取和替换。变量 FILE_PATH 应反映 HPC 源目录中每个文件的相对路径,而不仅仅是文件名。在尝试下载文件之前,请确保本地目录存在;如果没有,请创建它。检查应该对单个文件执行,而不仅仅是目录。
@echo off
setlocal enabledelayedexpansion
set HPC_SOURCE=\\storage\myLab\sharedata\LDSC_resource
set LOCAL_TARGET=F:\GeneResource
for /r "%HPC_SOURCE%" %%a in (*) do (
set FILE_PATH=%%a
set RELATIVE_PATH=!FILE_PATH:%HPC_SOURCE%=!
set LOCAL_DIR=%LOCAL_TARGET%!RELATIVE_PATH!
set LOCAL_FILE_PATH=!LOCAL_DIR!\%%~nxa
if not exist "!LOCAL_DIR!" (
mkdir "!LOCAL_DIR!"
)
if exist "!LOCAL_FILE_PATH!" (
echo File %%~nxa already exists in !LOCAL_DIR!
) else (
scp [email protected]:"%%a" "!LOCAL_FILE_PATH!"
echo Downloaded %%~nxa to !LOCAL_DIR!
)
)
echo All downloads completed.
pause