请求提供仅传输图片视频格式文件的FTP命令支持
实现指定格式文件的FTP递归传输(保留目录结构)
当然有办法搞定这个需求!原生FTP命令的功能确实比较受限,但我们可以借助更灵活的FTP客户端工具,比如lftp或者ncftp,它们支持递归传输和精准的文件过滤,完美匹配你的需求。下面是具体的实现方案:
推荐方案:使用lftp完成传输
lftp是一款功能强大的命令行FTP客户端,自带的mirror命令可以轻松实现反向同步(本地到远程)、目录结构保留和文件过滤。
具体命令
lftp -u 你的用户名,你的密码 ftp://你的远程服务器地址 << EOF mirror --reverse --include='*.jpg' --include='*.png' --include='*.mpeg' --exclude='*' /本地根目录 /远程目标根目录 quit EOF
参数解释
-u 用户名,密码:直接指定FTP的登录凭据,避免交互输入--reverse:默认mirror是从远程同步到本地,加上这个参数就变成本地同步到远程--include='*.格式':指定要包含的文件格式,这里我们添加jpg、png、mpeg三种--exclude='*':排除所有未被include指定的文件,确保只有目标格式被传输/本地根目录:你的本地文件的上级目录(也就是包含directory、directory2、directory3的那个目录)/远程目标根目录:远程服务器上要存放这些目录结构的目标位置
举个例子,如果你的本地文件都在/home/me/my-files/下,远程要传到/ftp-storage/my-content/,命令就变成:
lftp -u john,123456 ftp://ftp.example.com << EOF mirror --reverse --include='*.jpg' --include='*.png' --include='*.mpeg' --exclude='*' /home/me/my-files/ /ftp-storage/my-content/ quit EOF
备选方案:使用ncftp完成传输
ncftp也是常用的FTP工具,它的ncftpput命令支持递归传输和通配符过滤:
具体命令
# 先确保bash开启globstar(支持**递归匹配子目录) shopt -s globstar ncftpput -R -u 你的用户名 -p 你的密码 你的远程服务器地址 /远程目标根目录 /本地根目录/*.{jpg,png,mpeg} /本地根目录/**/*.{jpg,png,mpeg}
参数解释
-R:开启递归传输,自动创建对应的远程目录结构-u/-p:分别指定FTP的用户名和密码*.{jpg,png,mpeg}:匹配根目录下的目标格式文件**/*.{jpg,png,mpeg}:匹配所有子目录下的目标格式文件(需要globstar支持)
原生FTP脚本方案(不推荐,仅作参考)
如果必须使用原生ftp命令,需要结合find命令写一个简单脚本,手动处理目录创建和文件上传:
#!/bin/bash # 配置参数 FTP_USER="你的用户名" FTP_PASS="你的密码" FTP_HOST="你的远程服务器地址" LOCAL_DIR="/本地根目录" REMOTE_DIR="/远程目标根目录" # 找出所有符合格式的文件 find "$LOCAL_DIR" -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.mpeg" \) | while read file; do # 计算文件相对本地根目录的路径 rel_path="${file#$LOCAL_DIR/}" # 计算远程服务器上对应的目录 remote_target_dir="$REMOTE_DIR/$(dirname "$rel_path")" # 连接FTP,创建目录并上传文件 ftp -inv "$FTP_HOST" << EOF user $FTP_USER $FTP_PASS mkdir -p "$remote_target_dir" cd "$remote_target_dir" put "$file" quit EOF done
这个方案的缺点是效率较低,因为每个文件都要建立一次FTP连接,适合文件数量不多的场景。
内容的提问来源于stack exchange,提问作者Kristián Stroka
相关产品推荐
相关产品推荐

