Awali awalan dalam tar

12

Saat ini saya lakukan dalam skrip shell sangat tidak efisien:

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

Saya ingin semuanya terkandung dalam direktori bernama $ VERSION - apakah ada cara untuk melakukan ini tanpa harus menyalin semuanya seperti pada skrip di atas?

Robby75
sumber
Mengapa menyalinnya? Kenapa tidak tar cjf archive.tar.bz2 $MYPATH?
Chewie
1
@Chewie katanya, dia ingin versi $ sebagai dir induk dalam arsip.
Kent
Oh, aku melihatnya sekarang.
Chewie

Jawaban:

21

Versi GNU dari tar mendukung --transform opsi (dan aliasnya --xform ), Anda bisa menggunakannya seperti ini

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

Misalnya, diberikan pohon direktori ini

foo
└── foo.txt

perintah

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

akan menghasilkan arsip seperti

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt
toro2k
sumber
3
Patut dicatat bahwa pendekatan ini mungkin memutus hubungan simbolik. Berlanjut flags=r; Memecahkan masalah seperti yang disebutkan dalam stackoverflow.com/a/29661783/388803 .
eregon
jangan menyertakan garis miring; ketika saya meletakkan garis miring di transformasi, awalan asli tidak terjawab; misalnya s/^a\//b\//, itu tar -t masih menunjukkan a/ sementara semua file lainnya berada di bawah b/; Saya menganggap ini berbahaya, dan saya tidak benar-benar perlu melindungi terhadap beberapa file lain dengan awalan yang sama yang bukan direktori dalam file tar; jadi tidak ada garis miring yang baik-baik saja, aku tidak keberatan mengetahui cara terbaik untuk menangani kasus ini a/ ditransformasikan tetapi tidak aa/ jika itu saudara kandung dari simpul akar.
ThorSummoner
13

Untuk tar direktori saat ini dan menambahkan awalan, ini bekerja untuk saya:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .
Andy Balaam
sumber
0

Jika Anda bisa pergi tanpa mempertahankan tautan simbolis di dalam pohon file yang Anda tarring, Anda bisa melakukannya

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

Itu h Opsi berarti symlink dereference, yaitu termasuk file atau direktori yang ditunjuk oleh tautan tersebut daripada hanya mencatat fakta bahwa ada symlink dan apa yang ditunjukkan.

Ian Roberts
sumber