Рассмотрим один tar-файл из внешней системы, который содержит несколько каталогов с различными атрибутами, которые я хочу сохранить, такими как разрешения, mtimes и т. Д. Как я могу легко взять подмножество этих файлов как обычный пользователь (не root)?
Ищу что-то вроде:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Также важно, чтобы основные атрибуты (владелец, группа, режим, mtime) в этом архиве tar были сохранены. Как насчет других атрибутов в файле tar, таких как расширенные ключевые слова заголовка ?
Бонусные баллы за решение, которое позволяет избежать использования временного каталога в случае, если этот подкаталог содержит огромные файлы.
@original.tar
подход возможен с bsdtar. Кажется, работает с расширенными атрибутами и сжатием, а также</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(и по какой-то причине пустой выбор производит серию нулевых байтов, но для меня это не является большой проблемой).s/old/new/
он не работает с файлами из старых архивов, использующих @ old.tgz, он работает только с реальными файлами, архивируя их непосредственно из файловой системы. Это действительно позор, поскольку это был бы самый полезный вариант использования для меня.Самый простой способ - скопировать весь архив; Я полагаю, вы не хотите этого делать, потому что он слишком большой.
Обычные инструменты командной строки (
tar
,pax
) не поддерживают копирование членов архива в другой архив.Если вам не нужно сохранять права собственности, я бы предложил использовать файловые системы FUSE . Вы можете использовать archivemount для монтирования архива как файловой системы; сделайте это для исходного архива и запустите tar на смонтированной файловой системе.
В качестве альтернативы вы можете использовать AVFS :
Кроме того, вы можете запустить
tar
исходный архив и распаковать его на удаленный компьютер через SSHFS .Однако все эти методы громоздки, если вам нужно сохранить право собственности. Все они включают извлечение в файл на локальном компьютере, поэтому владельцем этого файла должно быть предполагаемое удаленное владение. Это требует запуска от имени пользователя root и может не дать ожидаемого результата, если файлы принадлежат учетным записям, чьи имена или идентификаторы отличаются на локальном компьютере и на удаленном хосте.
tarfile
Библиотека Python предоставляет довольно простой способ манипулирования членами tar, поэтому вы можете перемещать их из одного файла tar в другой. Он поддерживает стандартные форматы POSIX (ustar, pax), а также некоторые расширения GNU. Вот непроверенный скрипт Python, который считывает файл tar (возможно, сжатый с помощью gzip или bzip2) на свой стандартный ввод и записывает файл tar, сжатый с помощью bzip2, на свой стандартный вывод. Члены из источника копируются, если они начинаются с аргумента, переданного сценарию.Быть призванным как
источник
Альтернативный подход без привилегий - использовать
fakeroot
программу, чтобы притвориться, что вам разрешено менять владельца. В то время как другие атрибуты tar потеряны, он сохраняет режимы mtime и uid / gid. Эти команды создают временный каталог, извлекают подмножество файлов и, наконец, создают новый архив:источник
У GNU
tar
есть--delete
опция:Таким образом, вы можете получить подмножество входного tar, указав, что не следует включать в вывод.
К сожалению, я не смог получить
--exclude
опцию для работы--delete
, так что сначала вам нужно получить явный список (-t
) вещей, которые нужно удалить, а затем передать его другому вызовуtar
.Или вы можете сохранить список во внешнем файле, если он слишком длинный или сложный:
источник
Из того, что я знаю,
tar
команда не может использовать формат tar как для ввода, так и для вывода. Вам придется каким-то образом извлекать файлы локально и снова использовать tar для создания tar-файла на лету, что-то вроде этого (-
означает, что вместо файла используется стандартный ввод / вывод):Обратите внимание,
tar
что возможность извлекать файл tarfile непосредственно из другого файла tarfile - интересная идея ...источник