Ist es möglich, ein Verzeichnis innerhalb eines tar-Archivs umzubenennen? Mein Anwendungsfall ist, dass ich eine extern bereitgestellte RPM-Spezifikationsdatei habe, die einen Tarball mit einer bestimmten Verzeichnisstruktur annimmt, und ich habe einen extern bereitgestellten Tarball, dessen Verzeichnisname der obersten Ebene nicht mit den Erwartungen der Spezifikationsdatei übereinstimmt. Ich kontrolliere weder das Skript, das die Tarballs generiert, noch die RPM-Spezifikationsdatei, so dass ich keine Änderung vornehmen kann, um sie an die anderen anzupassen.
Was ich getan habe, ist, den Teer zu entfernen, den Verzeichnisnamen zu ändern und dann einen neuen Tarball zu erstellen, aber ich habe mich gefragt, ob es eine Alternative dazu gibt.
Antworten:
Zumindest für Archive, die mit dem alten Format kompatibel sind und in denen Dateinamen in einem Feld mit fester Größe (100 Byte) gespeichert sind, sollte es nicht sehr schwierig sein, aber ich kenne kein Tool, das a umbenennen kann Datei an Ort und Stelle in einem Tar-Archiv. Außerdem müssten Sie bei einem komprimierten Archiv ohnehin eine neue Datei erstellen.
Es sollte noch einfacher sein, aber ich kenne kein vorhandenes Tool, mit dem ein Archiv gefiltert und Dateien umbenannt werden können. Sie können eine über tar-Bibliotheken in Skriptsprachen erstellen. Hier ist beispielsweise ein Proof-of-Concept-Skript zum Umbenennen eines Verzeichnisses in einem Tar-Archiv mit Perl
Archive::Tar
. Das Archiv wird vollständig in den Speicher geladen. Dies ist eine intrinsische Einschränkung vonArchive::Tar
.GNU tar hat nicht die Fähigkeit, Mitglieder im laufenden Betrieb umzubenennen, aber
pax
(POSIXs Ersatz fürcpio
undtar
). Es ist jedoch nicht möglichpax
, aus einem Archiv sowohl Lese- als auch Schreibvorgänge durchzuführen. Sie können das Archiv als regulären Baum über AVFS verfügbar machen und ein neues Archiv mit erstellenpax
. Dadurch werden die Dateinamen (mit Ausnahme der transformierten), Inhalte, Zeiten und Modi beibehalten, der Dateieigentum wird jedoch auf Sie zurückgesetzt (sofern sie nicht als Root ausgeführt werden).quelle
--transform
seit mindestens 2010 die Möglichkeit, Dateien im laufenden Betrieb umzubenennen. Ein Beispiel finden Sie unter: scriptsandoneliners.blogspot.com/2019/11/…--transform
können Sie Dateien umbenennen, wenn Sie ein Archiv erstellen oder extrahieren. Aber wie benennt man Dateien in einem Archiv um, ohne es zu extrahieren? (Extrahieren ist keine gute Lösung: Möglicherweise verfügen Sie nicht über genügend Speicherplatz. Möglicherweise verfügen Sie nicht über die Berechtigung, Besitzinformationen zu speichern. Möglicherweise können Sie Zeitstempel nicht exakt speichern.)Sowohl sr_s hack als auch Gilles 'Antwort sehen sehr gut aus, aber wenn Ihr Problem nur der Name des Stammverzeichnisses des Ziel-Tarballs ist, während Sie rpmbuild ausführen, könnte eine andere Lösung darin bestehen, das
%setup
Makro neu zu definieren , um die erforderliche Dir-Umbenennung durchzuführen .So etwas wie (Sie müssen dies an Ihre tatsächliche Konfiguration anpassen und verfeinern, insbesondere indem Sie das richtige Dekomprimierungswerkzeug ersetzen
old-dir
unddesired-dir
verwenden) in Ihrem~/.rpmmacros
:Ich würde das ehrlich gesagt nicht tun, wenn es nicht die exotischste Situation wäre, aber deine könnte der Fall sein :)
quelle
Schauen Sie sich diese Seite einfach an, aber finden Sie die richtige Antwort an einer anderen Stelle:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Es besagt, dass Sie -n an das% setup-Makro übergeben können, um rpmbuild den Namen des Ordners der obersten Ebene im Tarball mitzuteilen
quelle
Hässlicher Hack, aber vielleicht hilft dir das, wenn du
tar
mit Symlinks blödelst:Wenn Sie darüber nachdenken, ist es wahrscheinlich nicht so, wie Sie
rpm
es nicht mit den Argumententar
anstellen wollen, oder? (Edit: Vielleicht können Sie dies mit einem kniffligentar
Wrapper-Skript umgehen$PATH
.)quelle