Czy można zmienić nazwę katalogu wewnątrz archiwum tar? Mój przypadek użycia polega na tym, że mam dostarczony zewnętrznie plik specyfikacji RPM, który zakłada plik tar z pewną strukturą katalogów, i mam dostarczony zewnętrznie plik tarball, którego nazwa katalogu najwyższego poziomu nie jest zgodna z oczekiwaniami pliku spec. Nie kontroluję ani skryptu, który generuje pliki archiwów, ani pliku specyfikacji RPM, więc nie mogę zmienić żadnego z nich, aby pasował do drugiego.
To, co robiłem, to rozpakowywanie, zmiana nazwy katalogu, a następnie tworzenie nowego archiwum, ale zastanawiałem się, czy istnieje alternatywa.
Odpowiedzi:
Nie powinno to być bardzo trudne, przynajmniej dla archiwów zgodnych ze starym formatem, w których nazwy plików są przechowywane w polu o stałym rozmiarze (100 bajtów), ale nie znam żadnego narzędzia, które mogłoby zmienić nazwę plik na miejscu w archiwum tar. Poza tym przy skompresowanym archiwum i tak musisz utworzyć nowy plik.
Powinno to być jeszcze łatwiejsze, ale nie znam żadnego istniejącego narzędzia, które mogłoby filtrować archiwum, zmieniając nazwy plików w miarę upływu czasu. Możesz zbudować jeden na bibliotekach tar w językach skryptowych; na przykład, oto skrypt sprawdzający koncepcję, aby zmienić nazwę katalogu w archiwum tar za pomocą Perla z
Archive::Tar
. Archiwum jest ładowane całkowicie do pamięci; jest to nieodłączne ograniczenieArchive::Tar
.GNU tar nie ma możliwości zmiany nazwy członków w locie, ale
pax
(zastępuje POSIX nacpio
itar
) ma. Nie można jednakpax
zarówno czytać, jak i pisać z archiwum. Możesz udostępnić archiwum jako zwykłe drzewo za pośrednictwem systemu AVFS i utworzyć nowe archiwum za pomocąpax
. To zachowuje nazwy plików (z wyjątkiem przekształconych), zawartość, czasy i tryby, ale resetuje własność pliku (chyba że jest wykonywany jako root).źródło
--transform
co najmniej od 2010 roku, który pozwala na zmianę nazw plików w locie. Na przykład patrz: scriptsandoneliners.blogspot.com/2019/11/…--transform
pozwala zmieniać nazwy plików podczas budowania lub rozpakowywania archiwum. Ale jak zmienić nazwy plików w archiwum bez rozpakowywania go? (Wyodrębnianie nie jest dobrym rozwiązaniem: możesz nie mieć wystarczającej ilości miejsca na dysku; możesz nie mieć uprawnień do zachowania informacji o własności; możesz nie mieć możliwości zachowania znaczników czasu dokładnie ...)Zarówno hack sr_, jak i odpowiedź Gillesa wyglądają bardzo dobrze, ale jeśli twoim problemem jest tylko nazwa katalogu głównego docelowego archiwum tar, podczas uruchamiania rpmbuild, innym rozwiązaniem może być ponowne zdefiniowanie
%setup
makra w celu przeprowadzenia wymaganej zmiany nazwy katalogu.Coś jak (będziesz musiał dostosować i udoskonalić to do aktualnej konfiguracji, w szczególności zastępując
old-dir
adesired-dir
i za pomocą odpowiedniego narzędzia dekompresji) to w twojej~/.rpmmacros
:Szczerze mówiąc, nie zrobiłbym tego, gdyby nie najbardziej egzotyczna sytuacja, ale twoja może tak być :)
źródło
Wystarczy wyświetlić tę stronę, ale znaleźć poprawną odpowiedź w innym miejscu:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Mówi, że możesz przekazać -n do makra% setup, aby powiedzieć rpmbuild nazwę folderu najwyższego poziomu w archiwum
źródło
Brzydki hack, ale może ci to pomóc, oszukiwanie za
tar
pomocą dowiązań symbolicznych:Myśląc o tym, prawdopodobnie tak nie jest, ponieważ
rpm
nie pozwoli ci zadzierać z argumentamitar
, prawda? (Edycja: może jakiś trudnytar
skrypt otoki$PATH
może pomóc ci to obejść.)źródło