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

Ubuntu下如何检测FTP目录中已完成传输的文件并移动?

解决FTP文件未完成传输就被移动的问题

方案1:基于文件大小稳定性检测

核心思路是只移动大小在指定时间内保持稳定的文件,确保文件传输完成。

示例Python代码:

import os
import time
import shutil

FTP_DIR = "/path/to/ftp/directory"
TARGET_DIR = os.path.expanduser("~/Documents")
CHECK_INTERVAL = 10  # 每10秒扫描一次目录
STABLE_THRESHOLD = 30  # 文件大小稳定30秒判定为传输完成

# 存储上次扫描的文件大小与时间
last_file_info = {}

def process_stable_files():
    current_files = [f for f in os.listdir(FTP_DIR) if os.path.isfile(os.path.join(FTP_DIR, f))]
    
    for filename in current_files:
        file_path = os.path.join(FTP_DIR, filename)
        current_size = os.path.getsize(file_path)
        
        if filename not in last_file_info:
            last_file_info[filename] = (current_size, time.time())
            continue
        
        prev_size, prev_time = last_file_info[filename]
        if current_size == prev_size:
            # 大小未变且超过稳定阈值,执行移动
            if time.time() - prev_time >= STABLE_THRESHOLD:
                try:
                    shutil.move(file_path, os.path.join(TARGET_DIR, filename))
                    del last_file_info[filename]
                    print(f"Moved completed file: {filename}")
                except Exception as e:
                    print(f"Failed to move {filename}: {str(e)}")
        else:
            # 文件仍在传输,更新记录
            last_file_info[filename] = (current_size, time.time())

if __name__ == "__main__":
    while True:
        process_stable_files()
        time.sleep(CHECK_INTERVAL)

可根据摄像头文件的传输速度,调整CHECK_INTERVAL和STABLE_THRESHOLD参数。

方案2:利用vsftpd日志触发移动

vsftpd会记录文件上传完成的日志,可通过监听日志条目触发移动操作。

步骤1:确认vsftpd日志配置

编辑/etc/vsftpd.conf,确保以下配置存在(默认已开启):

xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES

重启vsftpd生效:

sudo systemctl restart vsftpd

步骤2:编写日志监听脚本

#!/bin/bash

FTP_DIR="/path/to/ftp/directory"
TARGET_DIR="$HOME/Documents"

# 实时监听日志中的上传完成事件
tail -F /var/log/vsftpd.log | while read line; do
    if echo "$line" | grep -q "OK UPLOAD"; then
        # 提取上传的文件名
        filename=$(echo "$line" | awk -F '\"' '{print $4}')
        source_path="$FTP_DIR/$filename"
        
        if [ -f "$source_path" ]; then
            mv "$source_path" "$TARGET_DIR/"
            echo "Moved uploaded file: $filename"
        fi
    fi
done

方案3:用inotifywait监听文件关闭事件

直接使用inotifywait监听CLOSE_WRITE事件(文件写入完成并关闭时触发),比watchdog更精准。

步骤1:安装inotify-tools

sudo apt update && sudo apt install inotify-tools

步骤2:编写监听脚本

#!/bin/bash

FTP_DIR="/path/to/ftp/directory"
TARGET_DIR="$HOME/Documents"

# 监听目录下的文件写入完成事件
inotifywait -m -r -e close_write "$FTP_DIR" | while read dir event file; do
    if [ -f "$dir/$file" ]; then
        mv "$dir/$file" "$TARGET_DIR/"
        echo "Moved completed file: $file"
    fi
done

内容的提问来源于stack exchange,提问作者Miftakhul Arzak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:17