Yanıtlar:
Bu çalışmalı:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-CPaketi açmadan (veya paketlemeden) önce belirtilen dizinde değişiklik yapar. --strip-componentsBelirtilen 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-componentsseç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_namedizin 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_namearş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-componentsbunun yerine tercih etseniz de, yine de bu yöntemi kullanabilirsiniz .
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
İle paxPOSIX arşiv programı, kullanımı -sbir 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_namezaten 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_nameolmadan --strip-components 1. (2) Tersine, (Mat tarafından gönderildi) kabul cevabı özellikleri --strip-components 1olmadan --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 1ya, mkdirya --strip-components 1yö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 1gerç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.tgzadı verilen bir dizin oluşturursa ugly_name/, sağladığınız komut yaratır pretty_name/ugly_name/.