Мне кажется, что можно описать то, что вы хотите, в качестве «потокового редактора» для файлов 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
).