在 unix 中备份特定限制的文件

在 unix 中备份特定限制的文件

场景如下,我的文件夹中有 1000 个文件,每个文件约为 3 MB。我想将所有文件压缩成每个压缩包 50MB 并删除原始文件。

笔记:50MB 可能包含 20 个文件或 10 个文件,但该 zip 包应 <= 50MB。

我想在不丢失数据的情况下传输这些文件。文件必须采用 (tar/gzip/bzip) 格式。如果我们有其他方法来克服数据丢失,请向我提供建议。

需要创建一个shell脚本。

答案1

一种解决方案是使用 split 命令。

split 命令会将一个存档拆分为多个文件,为您完成所有艰苦的工作。

这是一个例子:

tar -cvf - file1 file2 file3 | split --bytes=50m --suffix-length=4 --numeric-suffix - myarchive.tar.

并解压:

cat myarchive.tar.* | tar xvf -

答案2

zip套件支持压缩包2压缩和--split.

bzip2 能满足您的要求吗?

-s splitsize --split-size splitsize 启用创建分割存档并设置分割大小。分割存档是可以分割为多个文件的存档。创建存档时,如果存档的大小达到指定的拆分大小,则关闭该拆分并打开下一个拆分。

...

拆分大小是一个数字(可选后跟一个乘数)。目前该数字必须是整数。乘数当前可以是 k(千字节)、m(兆字节)、g(千兆字节)或 t(太字节)之一。由于 64k 是最小分割大小,因此没有乘数的数字默认为兆字节。例如,要创建一个名为 foo 的分割存档,其中包含 bar 目录的内容,分割大小为 670 MB,这对于刻录到 CD 上可能有用,命令:

zip -s 670m -r foo 酒吧

可用于。

为确保数据完整性,rsync具有校验和验证。它慢得多,但会计算传输双方的校验和。

-c,--校验和

这改变了 rsync 检查文件是否已更改并且需要传输的方式。如果没有此选项,rsync 将使用 lqquick checkrq(默认情况下)检查发送方和接收方之间每个文件的大小和上次修改时间是否匹配。此选项更改此设置以比较具有匹配大小的每个文件的 128 位校验和。生成校验和意味着双方将花费大量磁盘 I/O 来读取传输中文件中的所有数据(这是在传输更改的文件时进行的任何读取之前),因此这可能会减慢速度显著地。

从:man zip,man rsync

答案3

未经测试的

cd /the/directory
files=(*)
i=0
z=0
create_zip=true
for ((i=0; i<${#files[@]}; i++)); do
    if $create_zip; then
        ((z++))
        zip_file=prefix.$z.zip
        create_zip=false
    fi
    # add the file
    zip $zip_file "${files[i]}"
    # check the size
    if (( $(stat -c %s $zip_file) >= 50000000 )); then
        # remove the previous file
        zip -d $zip_file "${files[i]}"
        create_zip=true
        # decrement the file index so this file gets added to the next zip
        ((i--))
    else
        echo rm "${files[i]}"            ### remove "echo" if it's OK
    fi
done

相关内容