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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:05:03