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

如何在Bash脚本中用Find筛选7天内文件并Tar打包后Rsync至远程?

如何在Bash脚本中打包指定目录7天内的文件并同步到远程服务器

我来帮你搞定这个Bash脚本的问题!你已经能用find定位到7天内的文件了,剩下的打包和同步其实很容易串起来,我给你一步步拆解:

1. 安全打包:避开文件名空格/特殊字符的坑

直接把find的输出传给tar很容易踩文件名带空格的坑,咱们用空字符分隔的方式处理,这是最稳妥的方案:

# 假设你要备份的5个目录是这些,可根据实际修改
TARGET_DIRS=(/path/to/dir1 /path/to/dir2 /path/to/dir3 /path/to/dir4 /path/to/dir5)

# 生成包含7天内文件的tar包
find "${TARGET_DIRS[@]}" -type f -mtime -7 -print0 | tar -czf recent_backup.tar.gz --null -T -

参数解释:

  • find ... -mtime -7:你已经熟悉的逻辑,定位修改时间在7天以内的文件
  • -print0:让find输出的文件名用空字符分隔,替代默认的换行,避免空格/特殊字符导致的解析错误
  • tar --null:告诉tar用空字符作为文件名的分隔符,和find的-print0配对使用
  • -T -:让tar从标准输入(也就是find的输出)读取要打包的文件列表
  • -czf:c创建新包,z用gzip压缩,f指定输出的tar包文件名

2. 完整脚本示例(带错误检查)

为了让脚本更健壮,咱们加上参数配置、错误检查和友好的输出提示:

#!/bin/bash

# 配置参数,根据实际情况修改
TARGET_DIRS=(/path/to/dir1 /path/to/dir2 /path/to/dir3 /path/to/dir4 /path/to/dir5)
BACKUP_FILE="recent_backup_$(date +%Y%m%d).tar.gz"  # 用日期命名,避免覆盖旧备份
REMOTE_USER="your_username"
REMOTE_HOST="remote.server.com"
REMOTE_PATH="/path/to/remote/backup/dir"

# 第一步:打包7天内的文件
echo "开始打包7天内的文件..."
find "${TARGET_DIRS[@]}" -type f -mtime -7 -print0 | tar -czf "$BACKUP_FILE" --null -T -

# 检查打包是否成功
if [ $? -ne 0 ]; then
    echo "打包失败!退出脚本"
    exit 1
fi
echo "打包完成,生成文件:$BACKUP_FILE"

# 第二步:用rsync同步到远程服务器
echo "开始同步到远程服务器..."
rsync -avz --progress "$BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"

# 检查同步是否成功
if [ $? -eq 0 ]; then
    echo "同步成功!"
    # 可选:本地备份文件不需要保留的话,可以删除
    # rm "$BACKUP_FILE"
else
    echo "同步失败!"
    exit 1
fi

3. rsync同步的细节优化

  • 如果远程服务器用的是非默认SSH端口(比如2222),可以加上-e参数指定端口:
    rsync -avz -e 'ssh -p 2222' --progress "$BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
    
  • 如果想让远程目录只保留最新的备份(自动删除旧备份),可以加上--delete参数,但要谨慎使用,避免误删重要文件:
    rsync -avz --delete --progress "$BACKUP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
    
  • -avz参数说明:a是归档模式(保留文件权限、时间戳等元数据),v是 verbose 模式(输出详细同步信息),z是传输时压缩(节省带宽)

4. 额外实用建议

  • 添加日志:把脚本的输出重定向到日志文件,方便后续排查问题,可在脚本开头加上:
    LOG_FILE="backup_sync_$(date +%Y%m%d).log"
    exec > "$LOG_FILE" 2>&1
    
  • 定时执行:如果需要每天自动备份,可以用crontab添加定时任务,比如每天凌晨2点执行:
    0 2 * * * /path/to/your/backup_script.sh
    
  • 权限准备:确保脚本有足够的权限读取目标目录的文件,并且配置好SSH免密登录远程服务器(避免每次执行都要输入密码)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:30:35