Başlatma sırasında dizin adı nasıl seçilir


124

Diyelim ki ugly_name.tarçıkartıldığı zaman ugly_namedizine dönüşen dosyam var. Ortaya çıkan dizin adı pretty_nameyerine hangi komutu kullanabilirim ?

Yanıtlar:


171

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

Sanırım aptal versiyona sadık kalacağım :)
phunehehe

28
@phunehehe: akıllı sürümün bir avantajı, önceden
hedeflenmemiş

2
Bunun "Pretty_name" den daha fazla çalıştığını ekleyebilir miyim? Ayrıca, bu şekilde belirli bir dizine kaldırmayı da kaldırabilirsiniz. Örnek:tar -xvf /tmp/backupfiles.tar -C /var/www/
General Redneck

2
Genellikle aptalca bir yol kullanırım ve çirkin ismin ne olacağını bilmeme ihtimaline karşı joker karakterler kullanırım ya da yazmak istemiyorum. mv ugly-* pretty_name
David Grayson

1
Zaten bir ugly_namedizin varsa aptalca bir şekilde çalışmaz . Bu arada, güzellik bakanın gözündedir.
kmiklas

30

İ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!'

9

Bunu kullan :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
&&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.
Manatwork 12:12

1
Bir dizin ugly_namezaten varsa, bunun istenmeyen sonuçları olabilir .
Drew Dormann

7

En basit yol

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

Olarak (1) Bu, açıkça en basit yol değildir smac89 bir cevap yayınlanmıştır sahip --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 .
G-Man

belki gerçek bir örnek netleştirmenize yardımcı olabilir: `wget dev.mysql.com/get/Downloads/MySQL-5.7/… tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz - bir üst -seviye = mysql57 --strip bileşenler 1 `
marquicus

Bu cevap daha zarif en upvote ile biri .
KaiserKatze

@ G-Man --strip-component 1ya, mkdirya --strip-components 1yöntem ya da yöntem ile gerekli , yoksa sadece alırsınız pretty_name/ugly_name/.
davidA

Bu gerçekten en basit yol
smac89

2

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 .


Güncelleme

İş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.


Bununla ilgili sorun, üst düzey dizini yeniden adlandırmaması, bunun yerine 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/.
davidA 23

1
@davidA İyi nokta. Bunun için bir düzeltme eklemek için cevabımı güncelledim
smac89
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.