Yanıtlar:
Bu çalışmalı:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
Paketi açmadan (veya paketlemeden) önce belirtilen dizinde değişiklik yapar. --strip-components
Belirtilen sayıda dizini arşivde kayıtlı dosya isimlerinden kaldırır.
Bunun gerçekten taşınabilir olmadığını unutmayın. GNU katranı ve en azından bazı BSD katranları --strip-components
seçeneği vardır, ancak diğer unix benzeri platformlarda var görünmüyor.
Bunu yapmanın aptalca yolu her yerde işe yarayacaktı.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
dizin varsa aptalca bir şekilde çalışmaz . Bu arada, güzellik bakanın gözündedir.
İle GNU tar ≥1.16 kullanın --transform
(transformasyon arşivinde tam yol uygulanır) her dosya adının bir sed regexp'in dönüşümü uygulamak için:
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Eğer ugly_name
arşivdeki tüm dosya isimlerinin toplevel bileşenidir, sen kesin eşleştirme ile rahatsız gerekmez:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Üst düzey dizinin adını bilmiyorsanız, --strip-components
bunun yerine tercih etseniz de, yine de bu yöntemi kullanabilirsiniz .
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
İle pax
POSIX arşiv programı, kullanımı -s
bir argüman olarak bir Sed-benzeri yedek ifade alır seçeneği.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Bunu kullan :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
List operatörünü bu iki komut arasında kullanmayı tercih edebilirsiniz , bu nedenle ikincisi ancak birincisi başarılı olursa çalıştırılır.
ugly_name
zaten varsa, bunun istenmeyen sonuçları olabilir .
En basit yol
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
olmadan --strip-components 1
. (2) Tersine, (Mat tarafından gönderildi) kabul cevabı özellikleri --strip-components 1
olmadan --one-top-level=pretty_name
. (3) Bu seçenekleri birleştirerek cevabınızın neden eskilerden daha iyi olduğunu açıklayabilir misiniz? Lütfen yorumlara cevap vermeyin; cevabınızı daha net ve daha eksiksiz hale getirmek için düzenleyin .
--strip-component 1
ya, mkdir
ya --strip-components 1
yöntem ya da yöntem ile gerekli , yoksa sadece alırsınız pretty_name/ugly_name/
.
UBuntu'dan bu cevap benim için çalıştı:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--One-üst düzey [= dir]'
Tar'a çıkarma dizininin altında (veya '-C' ye geçirilen) yeni bir dizin oluşturmasını ve tarbomblara karşı korunmak için kullanmasını söyler. Dir argümanının yokluğunda, yeni dizinin adı arşivin temel ismine eşit olacaktır (eğer varsa eksi arşiv soneki dosya adı). Bu dizin adı ile başlamayan üyelere (`--transform 've` --strip-components' den yapılan dönüşümlerden sonra) önek eklenir. Tanınan dosya adı sonekleri .tar ' dır ve See -auto-compress ile tanınabilir herhangi bir sonek .
İşaret edildiği gibi yorumlarla , bu yöntem ancak olarak, doğru şekilde yazıldığından arşivler için çalışmıyor başka cevap gösterileri, eklemek gerekir --strip-components 1
gerçekten işe yaraması için. Bu yeni seçenekle test ettim ve hem üst düzey bir isim olan hem de olmayan arşivler için çalışıyor.
pretty_name
, içinde orijinal üst düzey dizini bulunan yeni bir düzey oluşturmasıdır. Örneğin , tar xzf ugly_name.tgz
adı verilen bir dizin oluşturursa ugly_name/
, sağladığınız komut yaratır pretty_name/ugly_name/
.