应用场景

在自动化运维、日志归档、数据同步等场景中,我们常常只需要从远程 FTP/SFTP 服务器下载最新的若干文件,而不是全部文件。例如:

  • 每日只下载最新的20个日志文件用于分析;
  • 增量备份,每次只同步最新的20个数据文件;
  • 监控系统只拉取最新生成的报告或快照。

lftp 是一款功能强大的命令行文件传输工具,支持 FTP、SFTP、HTTP 等多种协议。虽然 lftp 本身没有直接提供“只下载最新N个文件”的参数,但我们可以通过组合命令灵活实现这一需求。


技术原理

要实现“仅下载时间最新的20个文件”,核心思路如下:

  1. 使用 cls 命令列出远程目录文件,并按修改时间排序;
  2. 利用 shell 命令(如 head)截取前20个最新文件名;
  3. 循环使用 mget 下载这些文件。

关键命令:

  • cls --sort=date -1:单列列出文件,按修改时间倒序(最新的在前);
  • head -n 20:截取前20行(即20个最新文件);
  • 结合 xargswhile 循环,逐个或批量下载。

命令举例

示例1:交互式手动操作

lftp -u username,password sftp://hostname

进入 lftp 交互界面后:

cls --sort=date -1 > filelist.txt
head -n 20 filelist.txt > newest20.txt
cat newest20.txt | xargs -i mget {}
exit

说明:

  • cls --sort=date -1 将文件按修改时间倒序单列输出,并重定向到 filelist.txt
  • head -n 20 取前20个文件名;
  • xargs -i mget {} 逐个下载这20个文件。

示例2:非交互式脚本(推荐)

#!/bin/bashHOST="sftp://hostname"
USER="username"
PASS="password"
REMOTE_DIR="/remote/directory"
LOCAL_DIR="./local_dir"lftp -u $USER,$PASS $HOST <<EOF
cd $REMOTE_DIR
cls --sort=date -1 | head -n 20 | tee newest20.txt
EOF# 逐一下载最新20个文件
lftp -u $USER,$PASS $HOST <<EOF
cd $REMOTE_DIR
lcd $LOCAL_DIR
cat newest20.txt | xargs -i mget {}
EOF

说明:

  • 先用 cls 获取最新20个文件名列表并保存为 newest20.txt
  • 再用 cat newest20.txt | xargs -i mget {} 批量下载。

示例3:纯一行命令(适合定时任务)

lftp -u username,password sftp://hostname -e "cd /remote/dir; cls --sort=date -1 | head -n 20 | xargs -i mget {}; exit"

说明:

  • -e 后直接跟 lftp 命令,适合写入 crontab 或一键执行。

示例4:结合本地脚本,增强容错

#!/bin/bashHOST="sftp://hostname"
USER="username"
PASS="password"
REMOTE_DIR="/remote/dir"
LOCAL_DIR="./local_dir"# 获取最新20个文件名
FILELIST=$(lftp -u $USER,$PASS $HOST -e "cd $REMOTE_DIR; cls --sort=date -1 | head -n 20; exit" 2>/dev/null)if [ -z "$FILELIST" ]; thenecho "未获取到文件列表,请检查远程目录或网络!"exit 1
fiecho "将下载以下文件:"
echo "$FILELIST"# 下载
lftp -u $USER,$PASS $HOST <<EOF
cd $REMOTE_DIR
lcd $LOCAL_DIR
$(echo "$FILELIST" | xargs -I{} echo "mget '{}'")
EOF

说明:

  • 增加错误判断,避免无文件时误操作;
  • 打印待下载文件列表,方便调试。

注意事项

  1. 时间排序依据cls --sort=date 默认按文件修改时间倒序排列,即最新文件在前。
  2. 文件名包含空格:若文件名有空格,建议用 while 循环代替 xargs,或调整 xargs 的分隔符参数。
  3. 目录结构:如需递归子目录,需调整 cls 参数并结合 find 命令。
  4. 权限与网络:确保 lftp 有权限读取远程目录,网络稳定,避免下载中断。

总结

通过 cls --sort=date 与 shell 命令组合,我们可以灵活实现 lftp 仅下载最新20个文件的需求。该方法不仅适用于 FTP,也完全兼容 SFTP、HTTP 等协议。无论是手动操作还是写入自动化脚本,都能高效、准确地完成任务。