Как я могу удалить ведущий путь из tar и retar это в памяти?

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

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

для удаления ведущего пути из всех объектов в загруженном tar но кажется, что нет никакого способа создать tar из stdin. Докажите меня неправильно.

7
задан 02.05.2010, 06:25

3 ответа

Несомненно можно создать tar из stdin. Использовать - как источник и канал вообще Вы хотите смолить в него.

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

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

2
ответ дан 07.12.2019, 15:11

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

2
ответ дан 07.12.2019, 15:11

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

Ни один из tars, кто документация, которую я проверил (tar GNU, звезда, bsdtar), кажется, не поддерживает Вашу точную операцию.

bsdtar интересен все же. @archive синтаксис кажется, что близко подошел бы к разрешению Вам считать tarfile и записать измененный, но запись страницы справочника для --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 (более старые выпуски используют tar GNU); это доступно как bsdtar на некоторых дистрибутивах Linux: Debian GNU/Linux, Ubuntu и некоторые ОСНОВАННЫЕ НА ОБ/МИН дистрибутивы), но рассмотрение кода, я уверен, что вызов просто вызовет “Опцию - компоненты полосы не разрешены в режиме-c” ошибка.

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

0
ответ дан 07.12.2019, 15:11

Теги

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