Я знаю, что копирование или передача того, что изначально было разреженным файлом, без использования утилиты, которая понимает разреженные файлы, приведет к заполнению «дыр». Есть ли способ или утилита, чтобы превратить то, что когда-то было редким файлом, обратно в разреженное?
Например:
создать разреженный файл:
% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
Есть ли способ:
% resparse TEST2
to get:
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
files
utilities
sparse-files
user25849
источник
источник
rsync -aS
.Ответы:
Редактировать 2015
начиная с util-linux 2.25,
fallocate
утилита для Linux имеет параметр-d
/--dig-hole
для этого.Выкопал бы дыру для каждого блока, полного нулей в файле
В старых системах вы можете сделать это вручную:
У Linux есть
FALLOC_FL_PUNCH_HOLE
опция,fallocate
которая может это сделать. Я нашел скрипт на github с примером:Использование FALLOC_FL_PUNCH_HOLE из Python
Я немного изменил его, чтобы сделать то, что вы просили - пробивать дыры в областях файлов, заполненных нулями. Вот:
Использование FALLOC_FL_PUNCH_HOLE из Python для пробивания дырок в файлах
Пример:
Обратите внимание, что
punch.py
для поиска могут быть найдены только блоки по 4096 байт, поэтому он может сделать файл не таким редким, каким был при запуске. Конечно, это можно сделать умнее. Кроме того, это только слегка проверено , поэтому будьте осторожны и делайте резервные копии, прежде чем доверять ему!источник
Если вы хотите сделать файл разреженным, вы можете сделать это напрямую с помощью
dd
.Из
dd(1)
руководства:Итак, обратите внимание, что он будет искать вперед, только если весь блок пуст. Для максимальной редкости используйте
bs=1
.источник
bs=512
самом деле не имеет смысла, так как диски являются блочными устройствами. (bs=4096
В более новых дисков)cp --sparse=always zeropadded.iso isnowsparse.iso
Если не
tar
считать его с-S
флагом (при условии GNU tar), и повторно выполнитьscp
... нет. Никакая полезность, о которой я знаю, не могла бы знать, где были «дыры».источник
Мне повезло с этим:
В
-I
силах RSync обновить все файлы, независимо от того, считает ли он , что они изменили или нет;-S
вызывает новые файлы , которые будут sparsified.-a
делает это рекурсивно, так что вы можете разделить целые деревья каталогов одной командой.Это не так хорошо, как специальный инструмент, который выслеживает дыры и уничтожает их
FALLOC_FL_PUNCH_HOLE
, но это лучше, чем дублирование целых деревьев каталогов.источник