在远程 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
为了记录目的,我将发布完成任务所用的步骤。任何更好的解决方案都将不胜感激。;-)
笔记:此解决方案使用lftp
FTP 客户端。您可能需要先将其安装在您的计算机上,然后才能继续。
解决方案:
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.txt
和cmds.txt
在此目录中创建。 - SFTP 主机SFTP 服务器 IP 地址或主机名。
- SFTP_用户,SFTP 密码用于连接服务器的 SFTP 用户和密码。
- 源目录SFTP 服务器上的源目录。必须移动此目录中的所有文件。
- 目标目录SFTP 服务器上的目标目录。文件已移动到此目录。