You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:24:03