Katran arşivinin yollarını çıkarmadan dönüştürün


10

GNU tar(1)adlı düzgün bir seçenek var --transform. Man sayfasından:

--transform, --xform EXPRESSION
dosya adlarını dönüştürmek için sed replace EXPRESSION kullanın

Bu, arşiv çıkarılırken yol adlarının anında dönüştürülmesini sağlar, böylece nerede ve nasıl çıkarılacağını kontrol edebilirsiniz.

Benim sorum, yerinde benzer bir dönüşüm gerçekleştirmenin bir yolu var mı ; yani, arşiv çıkarılmadan?

Misal

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

Kullanım örneği

Bir tararşivi temelde clueless son kullanıcılara dağıtıyorum ve benden müdahale etmeden doğru yola çıkarmasını istiyorum. Ben arşiv çıkarma, dizinleri yeniden adlandırmak ve arşiv büyük olduğu gibi yeniden paketleme önemsiz çözüm kaçınmak için çalışıyorum.


İsimleri oluştururken neden dönüştürmüyorsunuz?
Jose Luis Martin

@JoseLuisMartin Doğru. Benim kullanım durumum, arşivin zaten orada olması ve dediğim gibi, ambalajı açmak, dönüştürmek ve yeniden paketlemekten kaçınmak istiyorum.
Joseph R.10

1
Katran akışını diske çıkarmadan değiştirebilirsiniz: github.com/mafintosh/tar-stream#modifying-existing-tarballs , perldoc.perl.org/5.10.1/Archive/Tar.html , vb
vladr

Yanıtlar:


3

Arşivi archivemount veya mountavfs ile bağlayıp tekrar oluşturabilirsiniz

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

arşiv dosya sisteminde yazma işlemleri umount üzerinde tam bir yeniden yazma sağlar, bu yüzden büyük dosyalar için iyi bir seçenek gibi görünmüyor.

DÜZENLE

Uygulama ayrıntılarını bilmiyorum ama yazma dosyalarını dosya sistemi adımına kaydediyoruz gibi görünüyor.

Ahbapları çözmek için test et,

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

Çıktı:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

Avfs kazanıyor! .


1
+1 İlginç yeni komut. Ancak bu yaklaşımın arşivden çıkarılmasından farkı nedir? Uygulama açısından değil, performans açısından konuşuyorum.
Joseph R.10
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.