如何用find/rsync/rclone同步目录并限制2TB总大小(保留最新文件)
解决方案
一、修正rclone同步逻辑(实现自动删旧留新)
你原命令里的--max-transfer是限制单次传输的总数据量,不是控制目标盘的剩余空间阈值,所以触发2TB上限后会直接停止,不会自动删除旧文件。要实现「同步最新文件+空间不足时删旧腾位」,需要分两步执行:先清理目标盘的旧文件,再同步源盘最新内容。
步骤1:编写自动清理旧文件的脚本
创建clean_old_files.sh,脚本会检查目标盘剩余空间,当不足时按修改时间从旧到新删除文件,直到腾出足够缓冲空间:
#!/bin/bash TARGET_DIR="/var/HDD" # 预留缓冲空间(可根据需求调整,比如10GB) RESERVE_SPACE=10G while true; do # 获取剩余空间数值(单位GB) FREE_SPACE=$(df -Bg "$TARGET_DIR" | awk 'NR==2 {print $4}' | sed 's/G//') # 提取预留空间的数值部分 RESERVE_NUM=$(echo "$RESERVE_SPACE" | sed 's/G//') # 剩余空间达标则退出循环 if [ "$FREE_SPACE" -ge "$RESERVE_NUM" ]; then break fi # 找到目标盘中最旧的文件(按修改时间升序取第一个) OLDEST_FILE=$(find "$TARGET_DIR" -type f -printf '%T@ %p\n' | sort -n | head -n1 | awk '{print $2}') if [ -z "$OLDEST_FILE" ]; then echo "无可用文件可删除" break fi echo "删除旧文件:$OLDEST_FILE" rm -f "$OLDEST_FILE" done
给脚本添加执行权限:
chmod +x clean_old_files.sh
步骤2:修改rclone同步命令
先运行清理脚本腾空间,再执行同步,确保保留最新文件的同时同步删除操作:
# 先清理旧文件 ./clean_old_files.sh # 正确获取目标盘总容量(单位GB) MAX_TRANSFER=$(df -Bg /var/HDD | awk 'NR==2 {print $2}' | sed 's/G//')G # 执行同步 /usr/bin/rclone -v --config /home/user/.config/rclone/rclone.conf sync remote:/dir /var/HDD \ --include='/{folderA,folderB}/**' \ --order-by 'modtime,descending' \ --max-transfer "$MAX_TRANSFER" \ --check-first \ --delete-after \ --progress \ --transfers=1
说明:
- 替换
--delete-before为--delete-after,避免先删除文件导致不必要的空间波动 - 移除
--size-only,确保按修改时间识别最新文件(忽略大小会漏掉内容更新但尺寸不变的文件)
二、符合需求的find命令实现
以下脚本可实现「按修改时间降序筛选、总大小不超2TB、输出文件列表」的需求:
#!/bin/bash # 源目录路径 SOURCE_DIRS="/path/to/folderA /path/to/folderB" # 2TB换算为字节 MAX_SIZE=$((2048*1024*1024*1024)) # 输出文件路径 OUTPUT_FILE="/tmp/sync_files.txt" # 查找文件并按修改时间降序排序,累计大小不超2TB时输出路径 find $SOURCE_DIRS -type f -printf '%T@ %s %p\n' | sort -rn | awk -v max_bytes="$MAX_SIZE" ' BEGIN { total=0 } { if (total + $2 <= max_bytes) { print $3 total += $2 } else { exit } }' > "$OUTPUT_FILE"
参数说明:
-printf '%T@ %s %p\n':输出文件的修改时间戳(秒)、字节大小、完整路径sort -rn:按修改时间戳降序排列(最新文件在前)awk:累计文件总大小,超过2TB时停止输出,只保留前面的最新文件
配合同步工具使用
用rsync同步:
rsync -av --delete --files-from="$OUTPUT_FILE" / /var/HDD/
--files-from指定待同步文件列表,--delete删除目标盘中不在列表内的文件(同步源盘的删除操作)
用rclone同步:
先将文件路径转换为rclone支持的include格式,再执行同步:
sed 's/^/**/' "$OUTPUT_FILE" > /tmp/rclone_include.txt /usr/bin/rclone -v --config /home/user/.config/rclone/rclone.conf sync remote:/dir /var/HDD \ --include-from=/tmp/rclone_include.txt \ --delete-after \ --progress
内容的提问来源于stack exchange,提问作者blastbeng
相关产品推荐
相关产品推荐

