Intereting Posts
Как полностью удалить каталог из общего ресурса rsync Цветной вывод команды linux похож на «watch -d», чтобы выделить различия? Как я могу «объединить» шаблоны в одной строке? Почему в журналах отображается другой порт подключения ssh #, чем указанный? Как запустить программу при загрузке с определенным пользователем после запуска нескольких других служб? Поиск дубликатов файлов Ошибки после создания разделов во время установки Fedora 20 Тонны неизвестных соединений в нетогах Использование экрана для подключения к консоли Cisco Где локальные адреса APIC в QEMU? Почему я могу использовать cd для //, но не /// или //// или ///// или … Как использовать команду watch с цепочкой команд / программ с каналами Как избежать ряда подстановочных знаков в сценарии оболочки unix? HP-UX 9: резервная файловая система с использованием tar Чтение Системные руководства и большие файлы

Переименовать каталог внутри tar-архива

Можно ли переименовать каталог внутри tar-архива? Мой вариант использования заключается в том, что у меня есть файл спецификации RPM, предоставленный извне, который предполагает наличие tarball с определенной структурой каталогов, и у меня есть внешний архив, имя которого находится на верхнем уровне, не соответствует ожидаемому spec-файлу. Я не контролирую ни сценарий, который генерирует tarballs, либо файл спецификации RPM, поэтому я не могу внести изменения ни в один из них, чтобы соответствовать другому.

То, что я делал, – это разблокировать, изменить имя каталога, а затем создать новый tarball, но мне было интересно, есть ли альтернатива этому.

Это не должно быть очень сложно, по крайней мере для архивов, совместимых со старым форматом, где имена файлов хранятся в поле фиксированного размера (100 байт), но я не знаю ни одного инструмента, который может переименовать файл находится в архиве tar. Кроме того, при сжатом архиве вам все равно нужно создать новый файл.

Это должно быть еще проще, но я не знаю какого-либо существующего инструмента, который может фильтровать архив, переименовывать файлы по мере их поступления. Вы можете создать один поверх библиотек tar в языках сценариев; например, вот сценарий доказательной концепции для переименования каталога в tar-архиве с использованием Perl с Archive::Tar . Архив полностью загружается в память; это неотъемлемое ограничение Archive::Tar .

 #!/usr/bin/env perl ## Usage: tar-rename OLDPREFIX NEWPREFIX use strict; use warnings; use Archive::Tar; my ($from, $to) = @ARGV; my $tar = Archive::Tar->new(\*STDIN); foreach my $file ($tar->get_files()) { my $name = $file->name; $name =~ s~\A\Q$from\E($|/)~$to$1~; $file->rename($name) unless $name eq $file->name; } $tar->write(\*STDOUT); 

GNU tar не имеет возможности переименовывать элементы на лету, но pax (замена POSIX для cpio и tar ). Однако вы не можете заставить pax читать и писать из архива. Что вы можете сделать, так это открыть архив как обычное дерево через AVFS и создать новый архив с помощью pax . Это сохраняет имена файлов (кроме как преобразованные), содержимое, время и режимы, но сбрасывает права собственности на файлы (если они выполняются как root).

 mountavfs cd "~/.avfs$PWD/old.tgz#" pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz 

Ответ sr_ и ответ Gilles выглядят очень хорошо, но если ваша проблема – это просто имя корневого каталога целевого tarball, при запуске rpmbuild другим решением может быть переопределение макроса %setup для выполнения нужного переименования dir.

Что-то вроде (вам придется адаптировать и доработать это до вашей фактической конфигурации, в частности, заменив old-dir и desired-dir и используя инструмент правой декомпрессии), это в вашем ~/.rpmmacros :

 %setup cd ../BUILD \ rm -rf cd-player \ bunzip2 -dc ../SOURCES/%{name}-%{version}.tar.bz2 | tar -xvvf - \ if [ $? -ne 0 ]; then \ exit $? \ fi \ mv <old-dir> <desired-dir> \ cd <desired-dir> \ cd ../BUILD/cd-player \ chmod -R a+rX,gw,ow . 

Я бы честно не делал этого, если бы не в самой экзотической ситуации, но твой мог быть так:

Просто просмотрите эту страницу, но нашел правильный ответ в другом месте:

http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html

В нем говорится, что вы можете передать -n в макрос установки%, чтобы сообщить rpmbuild имя папки верхнего уровня в tarball

Уродливый взломать, но, возможно, это поможет вам, обманывая tar с символическими ссылками:

 $ mkdir ab $ date >> b/foo $ tar zcvf b-foo.tgz b/foo $ rm -rf b $ ln -sab $ tar zxvf b-foo.tgz xb/foo: Cannot extract through symlink b tar: Error exit delayed from previous errors. $ tar zxvPf b-foo.tgz xb/foo $ ls a foo 

Думая об этом, возможно, нет, поскольку rpm не позволит вам возиться с аргументами tar , не так ли? (Редактирование: возможно, какой-то сложный скрипт tar оболочки в $PATH может помочь вам в этом).