Katran arşivinin içindeki dizini yeniden adlandırma


14

Katran arşivinin içindeki bir dizini yeniden adlandırmak mümkün mü? Benim kullanım durumum, belirli bir dizin yapısı ile bir tarball varsayar harici olarak sağlanan bir RPM spec dosyası var ve ben üst düzey dizin adı spec dosyasının beklediğini uymayan harici olarak sağlanan bir tarball var. Ben tarballs veya RPM spec dosyasını üreten komut dosyası kontrol etmeyin, bu yüzden diğeri maç için bunlardan herhangi bir değişiklik yapamaz.

Yaptığım şey untarring, dizin adını değiştirmek ve sonra yeni bir tarball oluşturmak, ama bunu yapmak için bir alternatif olup olmadığını merak ediyordum.


3
Ne yazık ki bundan şüpheliyim, ama başka birinin bir yolu olup olmadığını görmek isterim. Bence en iyi seçim, untar, yeniden adlandırma ve yeniden katlama için bir senaryo yazmak.
Kevin

Yanıtlar:


8

En azından dosya adlarının sabit boyutlu (100 bayt) bir alanda depolandığı eski stil formatıyla uyumlu arşivler için çok zor olmamalı, ancak yeniden adlandırabilecek herhangi bir araç bilmiyorum tar arşivinde yer alan dosya. Ayrıca, sıkıştırılmış bir arşivle, yine de yeni bir dosya oluşturmanız gerekir.

Daha da kolay olmalı, ancak bir arşivi filtreleyebilecek, mevcut dosyaları yeniden adlandıran mevcut bir araç bilmiyorum. Komut dosyası dillerinde tar kitaplıklarının üzerine bir tane oluşturabilirsiniz; örneğin, burada Perl ileArchive::Tar bir tar arşivindeki bir dizini yeniden adlandırmak için bir kavram kanıtı komut dosyası . Arşiv tamamen belleğe yüklenir; bu özünde bir sınırlamadır 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, üyeleri anında yeniden adlandırma yeteneğine sahip değildir, ancak pax(POSIX'in cpiove yerine tar). Ancak, paxbir arşivden hem okuma hem de yazma yapamazsınız . Yapabileceğiniz şey, arşivi AVFS aracılığıyla normal bir ağaç olarak göstermek ve ile yeni bir arşiv oluşturmaktır pax. Bu, dosya adlarını (dönüştürülmüş olanlar hariç), içerikleri, saatleri ve modları korur, ancak dosya sahipliğini sizin için sıfırlar (kök olarak yürütülmedikçe).

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

GNU Tar, --transformen azından 2010'dan beri dosyaları anında yeniden adlandırmaya izin veriyor. Bir örnek için bkz. Scriptsandoneliners.blogspot.com/2019/11/…
A.Danischewski

@ A.Danischewski, --transformbir arşiv oluşturduğunuzda veya çıkardığınızda dosyaları yeniden adlandırmanıza olanak tanır. Ancak arşivdeki dosyaları çıkarmadan nasıl yeniden adlandırabilirsiniz ? (Çıkarma iyi bir çözüm değildir: yeterli disk alanınız olmayabilir; sahiplik bilgilerini koruma izniniz olmayabilir; zaman damgalarını tam olarak koruyamayabilirsiniz ...)
Gilles 'SO- kötü olmayı bırak'

Tamam, evet sadece posta durumunuzu gördüm "GNU katran anında üyeleri yeniden adlandırmak için yeteneği değil" - ama sadece giriş / çıkış yolunda. Varolan bir arşivdeki adları değiştirmek isterseniz, bir dizine bağlamak için archivemount'u kullanabilirsiniz, istediğiniz adları değiştirin ve bağlantısını kesin.
A.Danischewski

3

Hem sr_'nin hack'i hem de Gilles'in cevabı çok iyi görünüyor, ancak sorununuz sadece hedef tarball'un kök dizin adı ise, rpmbuild'i çalıştırırken %setup, gerekli dir yeniden adlandırma yapmak için makroyu yeniden tanımlamak farklı bir çözüm olabilir .

(Değiştirmekte özellikle adapte ve gerçek yapılandırmasına bu rafine gerekecek gibi bir şey old-dirve desired-dirGözlerinde farklı bu ve sağ dekompresyon araç kullanarak) ~/.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,g-w,o-w .

En egzotik durumda olmasaydı dürüstçe yapmam, ama seninki böyle olabilir :)



1

Çirkin kesmek, ama belki de bu tarsembollerle dalga geçmenize yardımcı olur :

$ mkdir a b
$ date >> b/foo
$ tar zcvf b-foo.tgz b/foo
$ rm -rf b
$ ln -s a b

$ tar zxvf b-foo.tgz                                                              
x b/foo: Cannot extract through symlink b
tar: Error exit delayed from previous errors.
$ tar zxvPf b-foo.tgz                                                             
x b/foo
$ ls a
foo

Bunu düşünmek, muhtemelen rpm, tartışmaları karıştırmanıza izin vermeyeceği gibi , değil tarmi? (Düzenleme: belki bazı zor tarsarıcı komut dosyası $PATHsizi bu konuda ele geçirebilir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.