使用ftp的mget -R命令递归下载子目录文件报错怎么解决
问题根因
标准ftp命令行工具的mget指令不支持-R递归参数,你传入的-R会被识别为待下载的文件名,工具遇到目录时无法直接下载,就会抛出Not a regular file报错。
解决方案
方案1:使用lftp工具实现(优先推荐)
如果设备A允许安装lftp工具,直接替换原有ftp逻辑即可,lftp原生支持目录递归同步,脚本示例如下:
#!/bin/sh HOST='你的FTP服务器IP' USER='你的FTP账号' PASS='你的FTP密码' # 服务器端要下载的目标目录 REMOTE_DIR='/RootDirectory/directory1' # 本地保存的目标目录,可自行修改 LOCAL_DIR='./' lftp -u ${USER},${PASS} ${HOST} << EOF cd ${REMOTE_DIR} lcd ${LOCAL_DIR} # mirror命令默认递归同步所有文件、子目录及子目录内文件 mirror quit EOF exit 0
说明:mirror指令会自动匹配服务器端的目录结构,在本地创建对应层级的文件夹并下载所有文件,不需要额外关闭交互提示。
方案2:仅使用原生ftp工具实现
如果设备A无法安装任何额外工具,可通过手动遍历目录的逻辑实现递归下载,脚本示例如下:
#!/bin/sh HOST='你的FTP服务器IP' USER='你的FTP账号' PASS='你的FTP密码' REMOTE_ROOT='/RootDirectory/directory1' # 递归下载函数 ftp_recursive_download() { local remote_path=$1 local local_path=$2 # 创建本地对应目录 mkdir -p "${local_path}" # 进入本地目录 lcd "${local_path}" # 进入服务器对应目录 ftp -n ${HOST} << EOF user ${USER} ${PASS} cd ${remote_path} prompt off mget * quit EOF # 获取服务器端当前目录下的所有子目录 subdirs=$(ftp -n ${HOST} << EOF user ${USER} ${PASS} cd ${remote_path} ls -l | grep '^d' | awk '{print $9}' quit EOF ) # 遍历子目录递归下载 for dir in ${subdirs}; do ftp_recursive_download "${remote_path}/${dir}" "${local_path}/${dir}" done } # 启动下载 ftp_recursive_download "${REMOTE_ROOT}" "./directory1" exit 0
说明:脚本会先下载当前目录下的所有普通文件,再识别子目录,递归创建本地对应目录后下载子目录内的所有内容,完全匹配你需要的目录结构。
内容的提问来源于stack exchange,提问作者gimi
相关产品推荐
相关产品推荐

