2

Мне нужно сжать файл размером 646,4 ГБ на внешнем жестком диске емкостью 1 ТБ. Этот жесткий диск в настоящее время имеет около 238,6 Гб свободного места. Однако, поскольку простые методы сжатия создают новый файл, я не смогу сжать этот файл, который представляет собой файл .vhdx (образ системы Windows). У меня есть доступ как к Windows (10 Tech Preview), так и к Unix-системам (как Mac, так и Ubuntu, если это поможет).

Мне либо нужен какой-то способ сжать эти файлы на месте, либо какой-то способ разделить этот файл на несколько файлов меньшего размера, не оставляя огромных 646,4 ГБ как есть (т.е. каким-то образом удаляются данные из этого файла, как это делается с его использованием). Спасибо!

4 ответа4

3

В окнах щелкните правой кнопкой мыши файл и выберите «Свойства», затем вкладку «Общие», затем кнопку «Дополнительно» и установите флажок «Сжать содержимое» для экономии места на диске. Это работает для отдельных файлов или папок.

2

Да, это может быть сделано.

Подтверждение концепции:

Позвольте мне получить файл для тестирования:

cp /bin/sh mylargefile

ls -l
-rw-r--r--  1 hennes  users  137208 Jul  1 20:05 my_large_file

Позволяет разбить его на 3 части, первая часть будет 50 КБ, вторая будет 50 КБ, третья будет 37 КБ. Мы начинаем в конце с третьей части.

 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)

Новый дд с разными номерами. Новый перемирие с разными номерами. ...

Если вы сделаете это без особой тщательности, вы, скорее всего, все испортите!

Приведенные выше примеры уже представляют собой смесь KB и KiB. Будьте осторожны с вашими номерами.

Также сделайте резервную копию. Это означает, что у вас уже есть в два раза больше места, так что это не должно быть ненужным. Используйте только в том случае, если вам нужно что-то продемонстрировать (например, в качестве домашней работы или в качестве доказательства концепции во время собеседования) и на свой страх и риск.

1

БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ: Я НЕ МОГУ ГАРАНТИРОВАТЬ ЭТОТ КОД СКРИПТА БЕЗОПАСНО !!

На моем Debian Stretch я сталкиваюсь с той же проблемой.
Я не знаю, чтобы какой-либо выпущенный инструмент выполнял эту задачу, поэтому я делаю для меня простой сценарий оболочки ($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
0

Если в файле VHD есть окна, что, как я полагаю, происходит из-за того, что вы говорите "Образ системы Windows".

Возможно, вам лучше установить VHD. Затем используйте такой инструмент, как imagex от Microsoft, чтобы сжать диск в файл образа.

imagex /capture /flags "professional" c: n:\images\windows.wim "Win"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .