Можно ли переименовать каталог внутри архива tar? Мой вариант использования заключается в том, что у меня есть предоставленный извне файл спецификации RPM, в котором предполагается наличие тарбола с определенной структурой каталогов, и у меня есть предоставленный извне тарбол, чье имя каталога верхнего уровня не соответствует ожидаемому файлу спецификации. Я не управляю ни скриптом, который генерирует тарболлы, ни файлом спецификации RPM, поэтому я не могу внести изменения в один из них, чтобы он соответствовал другому.
То, что я делал, - это безнаказанность, изменение имени каталога, а затем создание нового архива, но мне было интересно, есть ли альтернатива этому.
Ответы:
Это не должно быть очень сложно, по крайней мере для архивов, которые совместимы с форматом старого стиля, где имена файлов хранятся в поле фиксированного размера (100 байт), но я не знаю ни одного инструмента, который может переименовать файл на месте в архиве tar. Кроме того, со сжатым архивом вам все равно нужно будет создать новый файл.
Это должно быть еще проще, но я не знаю ни одного существующего инструмента, который может фильтровать архив, переименовывая файлы по мере необходимости. Вы можете создать один поверх библиотек tar на языках сценариев; например, вот сценарий проверки концепции для переименования каталога в архиве tar с использованием Perl
Archive::Tar
. Архив загружается полностью в память; это внутреннее ограничениеArchive::Tar
.GNU tar не имеет возможности переименовывать участников на лету, но
pax
(замена POSIX дляcpio
andtar
) делает. Тем не менее, вы не можете сделатьpax
чтение и запись из архива. Что вы можете сделать, это представить архив как обычное дерево через AVFS и создать новый архив с помощьюpax
. При этом сохраняются имена файлов (за исключением преобразованных), содержимое, время и режимы, но при этом восстанавливается право собственности на файл (если только он не выполняется от имени пользователя root).источник
--transform
по крайней мере с 2010 года, что позволяет переименовывать файлы на лету. Для примера, см .: scriptsandoneliners.blogspot.com/2019/11/…--transform
позволяет переименовывать файлы при создании или распаковке архива. Но как переименовать файлы в архиве, не распаковывая его? (Извлекая это не является хорошим решением , вы не можете иметь достаточно места на диске, вы не можете иметь права доступа для сохранения информации собственности, вы не можете иметь возможность сохранить временные метки точно ...)Как взлом sr_, так и ответ Жиля выглядят очень хорошо, но если ваша проблема - это просто имя корневого каталога целевого архива, при запуске rpmbuild, другое решение может заключаться в том, чтобы переопределить
%setup
макрос, чтобы выполнить необходимое переименование директории .Нечто подобное (вы должны адаптировать и уточнить это в вашей фактической конфигурации, в частности , замена
old-dir
иdesired-dir
и использовать правильный инструмент декомпрессии) это в~/.rpmmacros
:Честно говоря, я бы этого не сделал, если бы не самая экзотическая ситуация, но, возможно, у вас все получится :)
источник
Просто просмотрите эту страницу, но нашли правильный ответ в другом месте:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
В нем говорится, что вы можете передать -n макросу% setup, чтобы сообщить rpmbuild имя папки верхнего уровня в tarball
источник
Гадкий взлом, но, возможно, это вам поможет, дурачиться
tar
с символическими ссылками:Размышляя об этом, это, вероятно, не так, как
rpm
не позволит вам возиться с аргументамиtar
, не так ли? (Правка: может быть, какой-нибудь хитрыйtar
скрипт-обертка$PATH
поможет вам обойти это.)источник