7

Я думал, что мог бы сделать что-то вроде этого:

wget -O- http://example.com/funky.tar.gz | \
  tar --strip-components 1 -Ox | tar -cf fixed.tar.gz

удалить начальный путь из всех элементов в загруженном tar, но, похоже, нет способа создать tar из stdin. Пожалуйста, докажите, что я не прав.

3 ответа3

2

Модуль Python tarfile поддерживает как потоковое чтение, так и запись. Вы можете взять результат TarFile.extractfile() из одного файла tar и передать его прямо в TarFile.addfile() второго файла. Очевидно, для этого потребуется немного программирования, но все будет так, как вы просите.

2

Вы наверняка можете создать tar из stdin. Используйте - в качестве источника и отправьте все, что хотите, в него.

http://ss64.com/bash/tar.html

http://www.google.com/search?q=tar+stdin

0

Мне кажется, что можно описать то, что вы хотите, в качестве «потокового редактора» для файлов tar, который позволяет вам применять преобразование пути --strip-components . Идея состоит в том, чтобы взять файл tar в качестве входных данных и записать измененный файл tar в качестве выходных данных.

Ни один из дегтя s кто документации Я проверил (GNU деготь, звезда, bsdtar), кажется, поддерживает точное функционирование.

bsdtar это интересно, хотя. Его синтаксис @archive выглядит так, как будто он близок к тому, чтобы позволить вам прочитать tar-файл и написать измененный, но запись man- страницы для --strip-components говорит, что он работает только в режимах x и t ). Если бы он работал в режиме c , вы могли бы использовать что-то вроде этого:

wget -O - <url> | bsdtar -c --strip-components 1 -zf new.tar.gz @-

У меня нет bsdtar на моей машине (это tar в FreeBSD, а также tar в Mac OS X 10.6 (более старые выпуски используют GNU tar); он доступен как bsdtar в некоторых дистрибутивах Linux: Debian GNU/Linux, Ubuntu и некоторые дистрибутивы на основе RPM), но, глядя на код, я уверен, что вызов просто вызовет ошибку «Option --strip-components in mode -c».

Если вы хотите этого, вам, вероятно, придется развернуть собственную программу (или попросить кого-то сделать это за вас). К счастью, это может быть не так сложно, как кажется. bsdtar основан на очень хорошей libarchive библиотеке. Похоже, было бы довольно просто сделать программу, которая делает то, что вы хотите. Поскольку bsdtar уже содержит большую часть кода, вам необходимо скопировать один архив в другой (с помощью его обработки @archive ), вы, вероятно, могли бы даже сделать это, добавив некоторые функции в bsdtar. Простой подход «черт возьми, просто сделай это» может состоять в том, чтобы включить --strip-components для режима c и добавить вызов edit_pathname внутри append_archive. Проблема этого подхода заключается в том, что все преобразования edit_pathname будут применяться как к записям из @archive s, так и к путевым именам реальных файлов, указанным другими способами (аргументы командной строки, списки -T pathname и т.д.). Такое поведение может или не может быть в интересах официального bsdtar (возможно, по какой-то причине --strip-components еще не включен для режима c ).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .