Чи може файл, який був спочатку розрідженим, а потім розширеним, знову стає рідким?


29

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

Наприклад:
створити розріджений файл:

% 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

Вибачте, мені довелося
підірвати

1
Єдине, що може зробити це з усього, що я бачив, - це GNU 'cp', як у '% cp --sparse = завжди раніше-sparse-файл ново-sparse-файл' Зривник це не зробить ' на місці'.
користувач25849

Якщо ви хочете скопіювати розріджений файл і нехай копія буде рідкою, скористайтеся rsync -aS.
Жил "ТАК - перестань бути злим"

Відповіді:


30

Редагувати 2015 рік

станом на util-linux 2.25, fallocateутиліта Linux має для цього опцію -d/ --dig-hole.

fallocate -d the-file

Викопав би лунку для кожного блоку, заповненого нулями у файлі


У старих системах це можна зробити вручну:

У 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 байтів, тому він може не зробити файл настільки рідким, як це було при запуску. Звичайно, це можна зробити розумнішим. Крім того, це лише легка перевірка , тому будьте обережні і робіть резервні копії, перш ніж довіряти цьому!


1
Мені це подобається найкраще, тому що для нього не потрібно знову переписувати весь файл.
Пітер

8

Якщо ви хочете зробити файл рідким, ви можете зробити це безпосередньо за допомогою 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.


2
Будь-який розмір блоку менше, ніж bs=512насправді, не має сенсу, оскільки диски - це блокові пристрої. ( bs=4096у нових дисках)
lapo

схоже, це еквівалентноcp --sparse=always zeropadded.iso isnowsparse.iso
maxschlepzig

2

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


5
GNU cp перерозподілить файл: На сторінці man: Вкажіть --sparse = завжди для створення розрідженого DEST-файлу, коли файл SOURCE містить достатньо довгу послідовність нульових байтів.
користувач25849

Дивовижно. Щодня дізнайтеся щось - коли цей прапор був введений? Платить читати поодинокі сторінки "добре відомих" програм; D
тирк

2

Мені пощастило з цим:

cd whatever
rsync -avxWSHAXI . .

В -Iсилах RSync оновити всі файли, незалежно від того, чи вважає він , що вони змінили чи ні; -Sвикликає нові файли , які будуть sparsified. -aробить це рекурсивно, так що ви можете розділити цілі дерева каталогів однією командою.

Це не так добре, як замовний інструмент, який виловлює дірки і знищує їх FALLOC_FL_PUNCH_HOLE, але це краще, ніж копіювати цілі дерева каталогів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.