Как я могу изменить файл в архиве tar? - PullRequest
2 голосов
/ 06 января 2011

Я хочу написать (предпочтительно python) скрипт для изменения содержимого одного файла в файле gzipped tar. Скрипт должен работать на FreeBSD 6+.

В основном мне нужно:

  • открыть файл tar
  • если в файле tar есть _MY_FILE_:
    • , если в _MY_FILE_ есть строка, совпадающая с / RE /:
    • вставить строку после соответствующей строки
  • переписать содержимое в файл tar, сохранив все метаданные, кроме размера файла

Я повторю это для многих файлов.

Модуль Python tarfile, похоже, не может открывать tar-файлы для доступа на чтение / запись, когда они сжаты, что имеет определенный смысл. Однако я не могу найти способ скопировать tar-файл с изменениями.

Есть ли простой способ сделать это?

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Не думайте, что tar-файл - это база данных, которую вы можете читать / записывать - это не так.Файл tar представляет собой объединение файлов.Чтобы изменить файл в середине, вам нужно переписать остальную часть файла.(для файлов определенного размера вы можете использовать заполнение блоков)

Что вы хотите сделать, это обработать файл tarball по файлу, копируя файлы (с изменениями) в новый tarball.Модуль Python tarfile должен сделать это легко.Вы сможете сохранить атрибуты, скопировав их из старого объекта TarInfo в новый.

1 голос
/ 06 января 2011

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

Я думаю, что единственный способ:

  • Откройте tarfile, используя python tarfile, переименуйте его.
  • Создать дубликат пустого tar для исходного имени файла
  • Повторно добавьте все файлы, изменив тот, который вам нужен, перед повторным добавлением
  • Обязательно сбросьте правильный формат при чтении его при воссоздании

    tarfile.USTAR_FORMAT POSIX.1-1988 (устар) формат. tarfile.GNU_FORMAT Формат GNU tar. tarfile.PAX_FORMAT POSIX.1-2001 (pax) формат. tarfile.DEFAULT_FORMAT

http://docs.python.org/library/tarfile.html

...