Действительно ли возможно создать отредактированную копию файла, не израсходовав дополнительное дисковое пространство?

У Вас есть несколько опций:

  1. переустановите и libffi и пакеты ConsoleKit (обновите свою копию репозитория сначала, если у Вас есть локальный клон).

  2. удаление ConsoleKit - строго говоря это не необходимо (хотя это обеспечивает некоторый уровень пользовательского комфорта и дружелюбия).

  3. символьная ссылка libffi.so.5 кому: libffi.so.6 - грязный взлом, который мог бы работать, но также и может доставить много неприятностей, даже фатальных.

Можно также хотеть считать переключение на прокручивающийся выпуск версий - slackware-текущим.

6
25.10.2014, 14:13
3 ответа

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

Одна вещь, которую вы можете исследовать, это хранить файлы в файловой системе Btrfs и иметь оригиналы в одном "оригинальном" снимке, а обновленные версии - в виде, основанном на этом снимке. Это должно хорошо работать как для тегов ID3v1 (поскольку они являются концом файла), так и для тех файлов, которые имеют теги ID3v2¹, при условии, что у них достаточно зарезервированного места для изменений и не требуется перезапись MP3-файла. Таким образом, только фактические блоки, измененные для файла, занимают дополнительное место на диске.

При добавлении дополнительного файла в оригиналы необходимо сделать явный cp --reflink src dst для всех файлов, добавленных на более позднем этапе. После этого ваши загрузки будут работать с оригиналами и вашим редактором id3 (например, picard) и вашим музыкальным проигрывателем в производном представлении. Неизмененные (или еще не измененные) файлы в этом виде будут выглядеть точно так же, как и в оригинале.

Пример (начиная с тома Btrfs на /данные0 и файла test.mp3 в /tmp):

/data0$ btrfs subvolume create /data0/mp3org
Create subvolume '/data0/mp3org'
/data0$ cp /tmp/test.mp3 mp3org/
/data0$ btrfs subvolume snapshot /data0/mp3org/ /data0/id3update
Create a snapshot of '/data0/mp3org/' in '/data0/id3update'

Файл test. mp3 теперь доступен в обоих каталогах (mp3org и id3update):

/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

Измените файл на снимке:

/data0$ id3v2 -c "This is a change" id3update/test.mp3
/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7608
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

Размер файла не изменился, но изменилось содержимое второго. Это связано с тем, что комментарий поместился в зарезервированное место для id3v2 в оригинальном файле.

/data0$  grep -F "is a change" mp3org/* id3update/*
Binary file id3update/test.mp3 matches

Скопируйте другой файл в оригинальном подтоме, он не отображается в id3update:

/data0$ cp /tmp/test.mp3 mp3org/abc.mp3
/data0$ ls -l mp3org/ id3update/
id3update/:
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

Сделайте копию явного отражения:

/data0$ cp --reflink mp3org/abc.mp3 id3update/
/data0$ ls -l mp3org/ id3update/
id3update/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:29 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

И измените новый файл:

/data0$ id3v2 -c "another file change" id3update/abc.mp3
/data0$ grep -F change mp3org/* id3update/*
Binary file id3update/abc.mp3 matches
Binary file id3update/test.mp3 matches

Если mp3org заполняется автоматически, вы можете сохранить id3update в актуальном состоянии, регулярно выполняя скрипт, который делает cp --reflink src dst, если назначение еще не существует.

¹, которые чаще всего находятся в начале файла

6
27.01.2020, 20:28

Использование системы управления версиями, такая как GIT, вы можете «зарегистрироваться» или «Commit» любое количество версий вашего файла. GIT, вероятно, является одной из самых простых систем управления версией, с которыми можно снять, потому что он не требует использования отдельного сервера; Вся работа может быть сделана на вашей местной машине, и в Интернете есть много учебной информации. Есть также различные графические передние концы для него. GIT будет хранить разные версии файлов внутри в качестве сжатой версии исходного файла и различий между версиями. В рамках процесса коммита вы предоставляете сообщение, которое кратко описывает состояние преданных файлов, а затем вы можете просматривать доступные версии и «проверить», с какой версией, с которой вы хотите работать.

0
27.01.2020, 20:28

Для нахождения разницы есть команда diff - сравниваем файлы построчно. Вы можете сохранить различия в diff-файле и в любое время применить его с помощью patch - применить diff-файл к оригиналу. Но в любом случае нужно сначала сделать второй файл для внесения изменений (его можно удалить после получения diff-файла).

Если diff не может работать с бинарными файлами даже с параметром --text, вы можете свободно использовать bsdiff или, возможно, rdiff (спасибо Anko за комментарий).

0
27.01.2020, 20:28

Теги

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