Может ли файл, изначально разреженный, а затем расширенный, снова быть разреженным?

Я знаю, что копирование или перенос того, что изначально было разреженным файлом без использования утилиты, которая понимает разреженные файлы, приведет к заполнению «отверстий». Есть ли способ или утилита, чтобы превратить то, что когда-то было редким файлом, чтобы разрезать?

Например:
создать разреженный файл:

% 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
28 голосов | спросил user25849 16 +04002012-10-16T21:40:03+04:00312012bEurope/MoscowTue, 16 Oct 2012 21:40:03 +0400 2012, 21:40:03

4 ответа


27

Изменить 2015

как из util-linux 2.25, fallocate в Linux есть -d /--dig-hole.

fallocate -d the-file

Выкопал бы дыру для каждого блока, заполненного zeros в файле


В старых системах вы можете сделать это вручную:

У Linux есть опция FALLOC_FL_PUNCH_HOLE для fallocate, который может это сделать. Я нашел скрипт на github с примером:

Использование FALLOC_FL_PUNCH_HOLE из Python

Я немного изменил его, чтобы сделать то, что вы просили, - пробить дыры в областях файлов, заполненных нулями. Вот он:

Использование FALLOC_FL_PUNCH_HOLE из Python для пробивания отверстий в файлах

usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]

Punch out the empty areas in a file, making it sparse

positional arguments:
  FILE                  file(s) to modify in-place

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSE, --verbose VERBOSE
                        be verbose

Пример:

# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2

# see that it has holes
$ du --block-size=1 --apparent-size test1
12288   test1
$ du --block-size=1 test1
8192    test1

# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
12288    test2

# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
8192    test2

# verify
$ cmp test1 test2 && echo "files are the same"
files are the same

Обратите внимание, что punch.py обнаруживает только блоки из 4096 байт, поэтому он может не сделать файл таким же разреженным, как и когда вы начали. Разумеется, это можно сделать умнее. Кроме того, он слегка тестируется , поэтому будьте осторожны и сделайте резервные копии , прежде чем доверять ему!

ответил Jim Paris 17 +04002012-10-17T01:10:54+04:00312012bEurope/MoscowWed, 17 Oct 2012 01:10:54 +0400 2012, 01:10:54
7

Если вы хотите сделать файл разреженным, вы можете сделать это напрямую с помощью dd.

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

В руководстве dd(1):

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

Итак, обратите внимание, что он будет искать вперед, только если весь блок пуст. Для максимальной разреженности используйте bs=1.

ответил bahamat 17 +04002012-10-17T02:52:14+04:00312012bEurope/MoscowWed, 17 Oct 2012 02:52:14 +0400 2012, 02:52:14
2

Коротко tar -подтвердить его с помощью -S (при условии GNU tar) и повторное выполнение scp ... no. Никакая полезность, о которой я знаю, могла бы узнать, где были «дыры».

ответил tink 16 +04002012-10-16T23:23:10+04:00312012bEurope/MoscowTue, 16 Oct 2012 23:23:10 +0400 2012, 23:23:10
2

Мне повезло с этим:

cd whatever
rsync -avxWSHAXI . .

-I заставляет rsync обновлять все файлы, независимо от того, думает ли он, что они изменились или нет; -S заставляет новые файлы быть разделенными. -a делает это рекурсивно, поэтому вы можете разрезать целые деревья каталогов по одной команде.

Это не так хорошо, как инструмент на заказ, который охотится за отверстиями и уничтожает их с помощью FALLOC_FL_PUNCH_HOLE, но лучше, чем дублировать весь дерева каталогов.

ответил David Given 20 FriEurope/Moscow2013-12-20T01:08:19+04:00Europe/Moscow12bEurope/MoscowFri, 20 Dec 2013 01:08:19 +0400 2013, 01:08:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132