Katran başına önek ekle


17

Şu anda bir kabuk script çok verimsiz yapmak:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Her şeyi $ VERSION adlı dizinde yer almak istiyorum - yukarıdaki komut dosyası gibi her şeyi kopyalamak zorunda kalmadan bunu yapmak için bir yolu var mı?


Neden ilk etapta kopyalanıyor? Neden olmasın tar cjf archive.tar.bz2 $MYPATH?
Chewie

2
@Chewie, $ versiyonunu arşivde üst direktör olarak istediğini söyledi.
Kent

Oh, şimdi görüyorum.
Chewie

Yanıtlar:


26

GNU sürümü seçeneği (ve onun takma adı ) tardestekler, böyle kullanabilirsiniz--transform--xform

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Örneğin, bu dizin ağacı göz önüne alındığında

foo
└── foo.txt

komuta

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

gibi bir arşiv üretecek

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
Bu yaklaşımın sembolik bağları kırabileceği dikkat çekicidir. Eklemek flags=r;, sorunu stackoverflow.com/a/29661783/388803 bölümünde belirtildiği gibi çözer .
eregon

sondaki eğik çizgi eklemeyin; dönüşüme bir eğik çizgi koyduğumda, orijinal önek kaçırılır; örneğin s/^a\//b\//, diğer tüm dosyalar altındayken tar -thala gösterilir ; Bunun tehlikeli olduğunu varsayıyorum ve gerçekten tar dosyasında bir dizin olmayan aynı önek ile başka bir dosyaya karşı korumaya gerek yok; bu yüzden hiçbir eğik çizgi iyi değil, ben dönüştürülme davasını ele almak için en iyi yolu bilmek umurumda değil ama kök düğüm bir kardeş olsaydı değil. a/b/a/aa/
ThorSummoner

15

Geçerli dizini katlamak ve bir önek eklemek için bu benim için çalıştı:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

Katladığınız dosya ağacındaki sembolik bağlantıları korumadan uzaklaşabilirseniz,

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

hOpsiyon aracı yani dosya veya dizini dahil, sembolik KQUEUE o bağlantının gösterdiği basitçe bir sembolik ve ne işaret olduğunu aslında kayıt daha.


0

Rahatça bir dizin öneki eklemek için farklı bir ayırıcı kullanmak /içinde --transformargüman, örneğin +veya ,Andy'nin yanıtında gibi.

Böylece, daha basit bir durum için, geçerli dizinde bir sürü dosya var ve bir tarbomb oluşturmak istemiyorsunuz .

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

Sözdizimi s+search+replace+ve ^dosya adının başlangıcıyla eşleşir.

Ve şimdi, sadece OP'yi cevaplamak için - peki, /tmpçalıştırarak tüm dizininizi kopyalamaktan kaçınabilirsiniz :

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

Alternatif:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(sabit bağlantı, sembolik sorunlardan kaçınır)

Son ikisi eğlence değeri için dahil edildi, ben kendim toro2k'ın cevabına sadık kalacağım.

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.