![在 unix 中备份特定限制的文件](https://linux22.com/image/45668/%E5%9C%A8%20unix%20%E4%B8%AD%E5%A4%87%E4%BB%BD%E7%89%B9%E5%AE%9A%E9%99%90%E5%88%B6%E7%9A%84%E6%96%87%E4%BB%B6.png)
场景如下,我的文件夹中有 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 来读取传输中文件中的所有数据(这是在传输更改的文件时进行的任何读取之前),因此这可能会减慢速度显著地。
答案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