如何在同一个 FTP 服务器上移动一组文件?

如何在同一个 FTP 服务器上移动一组文件?

在远程 FTP 服务器上,我在目录中有一组文件remote.dir1。我想将该目录中的所有文件移动到remote.dir2

我正在使用lftp并尝试这样的事情:

lftp> mv remote.dir1/* remote.dir2/

它不工作并显示:Access failed: 550 remote.dir1/*: The filename, directory name, or volume label syntax is incorrect.

我也尝试过:

lftp> glob -a mv remote.dir1/* remote.dir2/

显示使用信息:Usage: mv <file1> <file2>

但是,移动单个文件是可行的:lftp> mv remote.dir1/file1 remote.dir2/

作为最后的手段,我们可以构造一个包含一组 lftpmv命令的文件source
是否有我不知道的解决方案?
或者,是否有任何能够完成此任务的命令行工具?

编辑:我被限制在 FTP 环境中,因此由于环境限制,只有使用 FTP 的解决方案才是可以接受的。

答案1

为了记录目的,我将发布完成任务所用的步骤。任何更好的解决方案都将不胜感激。;-)

笔记:此解决方案使用lftpFTP 客户端。您可能需要先将其安装在您的计算机上,然后才能继续。

解决方案:

lftp> renlist remote.dir1/ | "sed 's/\(.*\)/mv \"\1\" \"remote.dir2\/\"/'" > list  
lftp> source list  
lftp> !rm list  

或者单行TM

lftp> renlist remote.dir1/ | "sed 's/\(.*\)/mv \"\1\" \"remote.dir2\/\"/'" > list && source list && !rm list

答案2

看来 lftp 仅支持glob接受单个参数的命令语法,因此mv需要两个参数的语法被排除在外。

使用 FTP,您的服务器可能允许扩展命令,尤其是通过或类似方式执行有限的命令集SITE EXEC- 检查 FTP 服务器的文档、帮助 ( SITE HELP) 或登录横幅。然而,这些并不是标准化的,因此如果解决方案需要与 FTP 服务器无关,那么基于文件列表输出的脚本似乎是最好的主意。

答案3

虽然有点晚了,但在 2017 年 7 月,“mmv”命令已添加到 lftp。

Usage: mmv [OPTS] <files> <target-dir>
Move <files> to <target-directory> with wildcard expansion
 -O <dir>  specifies the target directory (alternative way)

因此,就你的情况而言:

mmv remote.dir1/* remote.dir2/

答案4

答案是赛科伊用于交互式会话。我能够在 shell 脚本中使用它(Bash 4.2.46、lftp 4.4.8-14.el7_9、CentOS 7.6.1810)。本质上:

local flist=files.txt
local cmds=cmds.txt
cd ${WORK_DIR}
LFTP_PASSWORD=${SFTP_PASSWORD} \
lftp --env-password -u ${SFTP_USER} sftp://${SFTP_HOST}/ << EOF
nlist ${SRC_DIR} > $flist
!cat $flist | grep -v "^\." | sed "s|\(.*\)|mv ${SRC_DIR}/\1 ${DST_DIR}/|" > $cmds
source $cmds
EOF

其中,脚本的变量含义如下:

  • 工作目录脚本创建中间文件的工作目录。文件files.txtcmds.txt在此目录中创建。
  • SFTP 主机SFTP 服务器 IP 地址或主机名。
  • SFTP_用户SFTP 密码用于连接服务器的 SFTP 用户和密码。
  • 源目录SFTP 服务器上的源目录。必须移动此目录中的所有文件。
  • 目标目录SFTP 服务器上的目标目录。文件已移动到此目录。

相关内容