我需要压缩 1TB 外置硬盘上的 646.4GB 文件。此硬盘目前有大约 238.6GB 的可用空间。但是,由于简单的压缩方法会创建一个新文件,因此我无法压缩此文件,因为它是一个 .vhdx 文件(Windows 系统映像)。我可以访问 Windows(10 技术预览版)和 Unix 系统(如果有帮助的话,也可以访问 Mac 和 Ubuntu)。
我要么需要某种方法来压缩这些文件,要么需要某种方法来将这个文件拆分成几个较小的文件,而不会让 646.4GB 的大小保持不变(即,使用完这个文件后,以某种方式删除其中的数据)。谢谢!
答案1
是的,可以做到。
概念证明:
让我获取一个文件来测试:
cp /bin/sh mylargefile
ls -l
-rw-r--r-- 1 hennes users 137208 Jul 1 20:05 my_large_file
让我们将其分成 3 部分,第一部分为 50k,第二部分为 50k,第三部分为 37k。我们从第三部分开始。
dd if=my_large_file of=part3 bs=1k skip=100
33+1 records in
33+1 records out
34808 bytes transferred in 0.000232 secs (150046592 bytes/sec)
~/test$ ls -l
total 180
-rw-r--r-- 1 hennes users 137208 Jul 1 20:05 my_large_file
-rw-r--r-- 1 hennes users 34808 Jul 1 20:09 part3
好的,我们可以复制文件的一部分。现在让我们将原始大文件截断为 100000 字节
truncate -s 100000 my_large_file
[hennes@dragon] ~/test$ ls -l
total 144
-rw-r--r-- 1 hennes users 100000 Jul 1 20:17 my_large_file
-rw-r--r-- 1 hennes users 34808 Jul 1 20:09 part3
使用您最喜欢的程序进行压缩。例如
bzip2 -9 part3
[hennes@dragon] ~/test$ ls -l part3.bz2
-rw-r--r-- 1 hennes users 11773 Jul 1 20:09 part3.bz2
冲洗并重复:
dd if=my_large_file of=part2 bs=1k skip=50
47+1 records in
47+1 records out
48800 bytes transferred in 0.024526 secs (1989735 bytes/sec)
新的 dd 有不同的编号。新的 truccate 有不同的编号。...
如果你不小心做这件事,你很可能会搞砸!
以上示例已混合了 KB 和 KiB。请特别注意您的数字。
另外,请备份。这意味着您已经有两倍的空间,所以这应该不是必要的。仅在您需要演示某些东西时使用(例如作为家庭作业或作为工作面试期间的概念证明),并自行承担风险。
答案2
在 Windows 中,右键单击文件并选择“属性”,然后选择“常规”选项卡,然后选择“高级”按钮,勾选“压缩内容以节省磁盘空间”。这适用于单个文件或文件夹。
答案3
重大警告:我无法保证该脚本代码的安全!!
在我的 Debian Stretch 上,我遇到了同样的问题。
我不知道有任何已发布的工具可以执行此任务,所以我为我自己制作了一个简单的 shell 脚本($1
是大文件):
对于压缩:
#!/bin/sh -e
#in-place compress single large file
compressor="lz4"
! test -d ./small-files && mkdir ./small-files
while true; do
size="$(stat -c%s ${1})"
block="$((1024*1024*1024))"
if [ "${size}" -gt "${block}" ] ; then
tail --bytes "${block}" "$1" | ${compressor} > "./small-files/$((${size}-${block}))"
sync
truncate -s "$((${size}-${block}))" "${1}"
sync
elif [ "${size}" -gt "0" ] ; then
tail --bytes "${block}" "$1" | ${compressor} > "./small-files/0"
sync
truncate -s "0" "${1}"
sync
else
break
fi
done
echo "success"
解压缩:
#!/bin/sh -e
#in-place decompress single large file
decompressor="lz4cat"
for size in $(ls -1 ./small-files | sort -n) ; do
truncate -s "${size}" "./${1}"
sync
${decompressor} "./small-files/${size}" >> "./${1}"
sync
rm "./small-files/${size}"
sync
done
echo "success!"
对于校验和:
#!/bin/sh -e
#in-place check compressed single large file
origincat () {
decompressor="lz4cat"
for size in $(ls -1 ./small-files | sort -n) ; do
${decompressor} "./small-files/${size}"
done
}
origincat | md5sum
答案4
如果 VHD 文件上有窗口,我认为它有,因为您说的是“Windows 系统映像”。
您可能最好安装 VHD。然后使用微软的 imagex 之类的工具将驱动器压缩为映像文件。
imagex /capture /flags "professional" c: n:\images\windows.wim "Win"