Apakah mungkin untuk mengganti nama direktori di dalam arsip tar? Kasus penggunaan saya adalah bahwa saya memiliki file spesifikasi RPM yang disediakan secara eksternal yang mengasumsikan tarball dengan struktur direktori tertentu, dan saya memiliki tarball yang disediakan secara eksternal yang nama direktori tingkat atasnya tidak cocok dengan yang diharapkan oleh file spesifikasi. Saya tidak mengontrol skrip yang menghasilkan tarbal atau file spesifikasi RPM, jadi saya tidak bisa membuat perubahan pada salah satu yang cocok dengan yang lain.
Apa yang telah saya lakukan adalah menghapus tanda, mengubah nama direktori, dan kemudian membuat tarball baru, tetapi saya bertanya-tanya apakah ada alternatif untuk melakukan itu.
Jawaban:
Seharusnya tidak terlalu sulit, setidaknya untuk arsip yang kompatibel dengan format gaya lama di mana nama file disimpan dalam bidang ukuran tetap (100 byte), tapi saya tidak tahu alat apa pun yang dapat mengubah nama menjadi file di tempat dalam arsip tar. Selain itu, dengan arsip terkompresi, Anda harus membuat file baru.
Seharusnya lebih mudah, tapi saya tidak tahu ada alat yang bisa menyaring arsip, mengganti nama file saat berjalan. Anda dapat membangun satu di atas pustaka tar dalam bahasa scripting; misalnya, inilah skrip pembuktian konsep untuk mengganti nama direktori dalam arsip tar menggunakan Perl dengan
Archive::Tar
. Arsip dimuat seluruhnya ke dalam memori; ini adalah batasan intrinsik dariArchive::Tar
.GNU tar tidak memiliki kemampuan untuk mengganti nama anggota on the fly, tetapi
pax
(pengganti POSIX untukcpio
dantar
) tidak. Namun, Anda tidak dapat membuatpax
keduanya membaca dan menulis dari arsip. Yang dapat Anda lakukan adalah mengekspos arsip sebagai pohon biasa melalui AVFS , dan membuat arsip baru denganpax
. Ini mempertahankan nama file (kecuali sebagai ditransformasikan), konten, waktu dan mode tetapi mengatur ulang kepemilikan file kepada Anda (kecuali dieksekusi sebagai root).sumber
--transform
setidaknya sejak 2010 yang memungkinkan penggantian nama file dengan cepat. Sebagai contoh, lihat: scriptsandoneliners.blogspot.com/2019/11/...--transform
memungkinkan Anda mengubah nama file saat membuat atau mengekstrak arsip. Tetapi bagaimana Anda mengganti nama file dalam arsip tanpa mengekstraksinya? (Mengekstrak bukanlah solusi yang baik: Anda mungkin tidak memiliki ruang disk yang cukup; Anda mungkin tidak memiliki izin untuk menyimpan informasi kepemilikan; Anda mungkin tidak memiliki kemampuan untuk melestarikan stempel waktu dengan tepat ...)Kedua hack sr_ dan jawaban Gilles terlihat sangat baik, tetapi jika masalah Anda hanyalah nama direktori root dari tarball target, saat menjalankan rpmbuild, solusi yang berbeda dapat mendefinisikan ulang
%setup
makro untuk melakukan penggantian nama dir yang diperlukan.Sesuatu seperti (Anda harus menyesuaikan dan memperbaiki ini dengan konfigurasi Anda yang sebenarnya, khususnya mengganti
old-dir
dandesired-dir
dan menggunakan alat dekompresi yang tepat) ini di Anda~/.rpmmacros
:Saya tidak akan jujur melakukan itu jika tidak dalam situasi yang paling eksotis, tetapi Anda bisa menjadi masalahnya :)
sumber
Cukup lihat halaman ini tetapi temukan jawaban yang tepat di tempat lain:
http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html
Dikatakan bahwa Anda bisa meneruskan -n ke% setup macro untuk memberi tahu rpmmbangun nama folder tingkat atas di dalam tarball
sumber
Retas yang jelek, tapi mungkin ini bisa membantu Anda, membodohi
tar
symlink:Berpikir tentang itu, mungkin tidak, karena
rpm
tidak akan membiarkan Anda mengacaukan argumentar
, kan? (Sunting: mungkin beberapatar
skrip pembungkus rumit$PATH
dapat membantu Anda mengatasi hal ini.)sumber