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

Unix环境下保留最新文件对并压缩归档旧文件的Shell脚本实现咨询

解决文件对归档:保留最新组,压缩旧文件

我来帮你搞定这个文件归档的问题!首先得先修正你脚本里的一个小坑:PATH是系统自带的环境变量,用来查找命令路径的,别用它存你的目录路径,换成SOURCE_DIR这类自定义变量更安全。

接下来核心思路很明确:先从文件名里提取日期,把同日期的.csum和.csv归为一组,找出最新的日期组,再把剩下的旧文件打包归档。

完整脚本实现

#!/bin/bash

# 替换成你的实际源目录和归档目录
SOURCE_DIR="/path/to/source/dir"
ARCH_DIR="/path/to/archive/dir"

# 确保归档目录存在,不存在就创建
mkdir -p "${ARCH_DIR}"

# 提取所有文件的日期部分,去重后逆序排序,取第一个就是最新日期
latest_date=$(find "${SOURCE_DIR}" -maxdepth 1 -type f -name "FILE_1_*.csum" \
    | awk -F'[_.]' '{print $3}' \
    | sort -r \
    | head -n 1)

# 如果没找到符合格式的文件,直接退出
if [ -z "${latest_date}" ]; then
    echo "没有找到匹配的文件对"
    exit 0
fi

echo "最新文件组的日期是: ${latest_date}"

# 收集所有不属于最新日期的.csum和.csv文件
old_files=$(find "${SOURCE_DIR}" -maxdepth 1 -type f \
    \( -name "FILE_1_*.csum" -o -name "FILE_1_*.csv" \) \
    | grep -v "${latest_date}")

# 如果没有旧文件,直接退出
if [ -z "${old_files}" ]; then
    echo "没有需要归档的旧文件"
    exit 0
fi

# 压缩旧文件,归档文件名带当前日期方便区分
archive_name="old_files_$(date +%Y%m%d).tar.gz"
tar -czf "${ARCH_DIR}/${archive_name}" ${old_files}

# 只有压缩成功才删除原文件,避免数据丢失
if [ $? -eq 0 ]; then
    rm ${old_files}
    echo "已成功将旧文件压缩归档至 ${ARCH_DIR}/${archive_name},并删除原文件"
else
    echo "压缩失败,未删除原文件"
    exit 1
fi

关键步骤拆解

  1. 提取最新日期:

    • 只找.csum文件就够了(因为每个.csv都对应一个.csum),用awk按_和.分割文件名,提取出中间的日期段
    • 逆序排序后取第一个,就是最新的日期
  2. 筛选旧文件:

    • 用find匹配所有.csum和.csv,再用grep -v排除掉最新日期的文件,剩下的就是要归档的旧文件
  3. 安全压缩与清理:

    • 归档文件名加上当前日期,方便后续管理不同批次的归档包
    • 检查压缩命令的返回值,只有压缩成功才删除原文件,避免意外丢失数据

额外提示

  • 如果你的文件名前缀不是固定的FILE_1_,可以把它改成变量,比如FILE_PREFIX="FILE_1_",这样脚本复用性更强
  • 测试的时候可以先把rm ${old_files}换成echo ${old_files},确认要删除的文件是正确的,再执行实际删除操作

内容的提问来源于stack exchange,提问作者Tech Sawy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:57:41