在Linux环境下,可以通过tar和Rclone的管道来直接将文件打包上传,以下是一个常见的用法示例

tar -czf - /path/to/files | rclone rcat remote:backup.tar.gz

其中-czf -表示用gzip压缩并输出到标准输出(即不创建本地文件,只是将内容传给管道)

|:管理符,将前一个命令的输出传递给下一个命令

rclone rcat:从标准输入接收内容并直接写入到远程存储。

示例:rclone sync /data/backup alist:/百度云盘/backup -P --log-file="/var/backup.log" --log-level=ERROR --exclude "panel/**" --delete-excluded --modify-window=1s
--exclude "排除的文件夹/**":指定要排除的文件夹,其中 "排除的文件夹/**" 表示排除文件夹及其所有子文件和子文件夹。替换 "排除的文件夹" 为你实际想排除的目录名称。
--checksum:启用校验和校验,rclone 将基于文件的校验和来判断文件是否发生变化,而不是依赖文件大小或时间戳。
-P:显示进度。
--log-file="/var/backup.log":将日志输出保存到 /var/backup.log 文件中。
--log-level=ERROR:只记录错误信息到日志文件。
这样设置后,rclone 会跳过指定的文件夹并使用校验和来验证文件是否需要同步。

打包分块上传

tar -czf - /path/to/files | split -b 200M - /tmp/backup_$(date +%Y%m%d).tar.gz.part --filter='rclone rcat remote:backup/$(basename "$FILE") --size-only'

$(basename "$FILE")是一个用于提取文件名的命令,basename会去掉路径中的目录部分,只保留文件名本身。

示例:由于我的split不是最新版本,split 不会自动将 "$FILE" 变量传递给 --filter 的命令,改用以下的

  1. 生成分块文件,放在 /tmp 目录

    cd /data && tar -czf - docker | split -b 200M - /tmp/docker_$(date +%Y%m%d).tar.gz.part
  2. 批量上传分块文件到远程目录

    for FILE in /tmp/docker_$(date +%Y%m%d).tar.gz.part*; do
        rclone rcat alist:/百度云盘/docker/$(basename "$FILE") --size-only < "$FILE"
    done

下载分块文件

rclone copy remote:backup /path/to/local/backup --include "backup_20231030.tar.gz.part*"
示例:rclone copy alist:/百度云盘/docker /data/backup --include "docker_20241030.tar.gz.part*"

合并分块文件

cat /path/to/local/backup/backup_20231030.tar.gz.part* > /path/to/local/backup/backup_20231030.tar.gz
示例:cat /data/backup/docker_20241030.tar.gz.part* > /data/backup/docker_20241030.tar.gz

解压文件

tar -xzf /path/to/local/backup/backup_20231030.tar.gz -C /path/to/extract/directory
示例:tar -xzf /data/backup/docker_20241030.tar.gz -C /data/backup/dockertest
如果觉得我的文章对你有用,请随意赞赏