是的,可以做到。

是的,可以做到。

我需要压缩 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"

相关内容