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
相关产品推荐
相关产品推荐

