Saya memiliki perintah berikut di bagian skrip shell cadangan:
tar -cjf site1.bz2 /var/www/site1/
Ketika saya daftar isi arsip, saya mendapatkan:
tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html
Tetapi saya ingin menghapus bagian /var/www/site1
dari direktori dan nama file dalam arsip, untuk menyederhanakan ekstraksi dan menghindari struktur direktori konstan yang tidak berguna. Tidak pernah tahu, kalau-kalau saya akan mengekstrak situs web yang dicadangkan di tempat data web tidak disimpan /var/www
.
Untuk contoh di atas, saya ingin memiliki:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
Jadi, ketika saya mengekstrak, file diekstraksi dalam direktori saat ini dan saya tidak perlu memindahkan file yang diekstrak setelahnya, dan agar struktur sub-direktori dipertahankan.
Sudah ada banyak pertanyaan tentang tar dan cadangan di stackoverflow
dan di tempat-tempat lain di web, tetapi kebanyakan dari mereka meminta untuk menjatuhkan seluruh struktur sub-direktori (perataan), atau hanya menambah atau menghapus inisial / dalam nama (saya tidak Saya tidak tahu apa yang berubah tepat saat mengekstraksi), tetapi tidak lebih.
Setelah membaca beberapa solusi yang ditemukan di sana-sini serta manual, saya mencoba:
tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
Tapi tidak satu pun dari mereka yang bekerja seperti yang saya inginkan. Beberapa tidak melakukan apa-apa, beberapa lainnya tidak lagi mengarsipkan sub-direktori.
Itu ada di dalam skrip shell cadangan yang diluncurkan oleh Cron, jadi saya tidak tahu, pengguna mana yang menjalankannya, apa path dan direktori saat ini, jadi selalu menulis path absolut diperlukan untuk semuanya, dan lebih suka tidak mengubah direktori saat ini untuk menghindari melanggar sesuatu lebih lanjut dalam skrip (karena tidak hanya membuat cadangan situs web, tetapi juga database, kemudian mengirim semua itu ke FTP dll.)
Bagaimana cara mencapai ini?
Apakah saya salah mengerti bagaimana opsi -C bekerja?
-C
berarti "ganti direktori", sementara mengganti jalur (atau awalan) hanya bisa dilakukan oleh--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 Anda dapat simpel -C (ubah direktori) dan --transformasi: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. `` `Jawaban:
Pada contoh di atas, tar akan berubah ke direktori
/var/www/site1
sebelum melakukan hal itu karena opsi-C /var/www/site1
diberikan.Dari
man tar
:sumber
tar
arsip semua di direktori saat ini. Dan-C
mengatur direktori saat ini.tar -czvf site1.tar.gz -C /var/www/ site1
(Perhatikan spasi, saya masih menggunakan -C, untuk cd ke dir induk, dan menentukan dir ke tar bukannya dot)./folders
bagaimana ini bisa dihapus?Opsi ini
-C
berfungsi; hanya untuk klarifikasi saya akan memposting 2 contoh:pembuatan tarball tanpa path lengkap: path penuh
/home/testuser/workspace/project/application.war
dan apa yang kita inginkan hanyalahproject/application.war
:Catatan: ada ruang antara
workspace
danproject
; tar akan mengganti path lengkap dengan adilproject
.ekstraksi tarball dengan mengubah jalur target (default ke
.
, yaitu direktori saat ini)tar
akan mengekstrak tarball berdasarkan jalur yang diberikan dan melestarikan jalur penciptaan; dalam contoh kita fileapplication.war
akan diekstraksi ke/home/deploy/project/application.war
./home/deploy
: diberikan pada ekstrakproject
: diberikan pada pembuatan tarballCatatan: jika Anda ingin menempatkan tarball yang dibuat di direktori target, Anda cukup menambahkan path target sebelum nama tarball. misalnya:
sumber
Tampaknya
-C
opsi upto tar v2.8.3 tidak bekerja secara konsisten pada semua platform (OS).-C
opsi dikatakan menambahkan direktori ke arsip tetapi pada Mac dan Ubuntu ia menambahkan awalan path absolut di dalam file tar.gz yang dihasilkan.Oleh karena itu solusi yang konsisten dan tangguh adalah
cd
masuk ke source_path (direktori induk dari source_dir) dan jalankanatau
dalam naskah Anda. Ini akan menghapus awalan path absolut dalam struktur direktori file tar.gz yang Anda hasilkan.
sumber
-cvf
ditambahkan setelahtar
), saya menemukan file tar.gz yang dihasilkan tidak memiliki path absolut di dalamnya, yang konsisten dengan beberapa jawaban lainnya. Jika menurut Anda tar rusak atau ketinggalan zaman pada kedua sistem yang saya gunakan untuk pengujian, harap tautkan ke beberapa dokumentasi yang akan mendukung jawaban Anda. Saya pikir-C
opsi ini mengubah direktori sebelum mengeksekusi (seperti pada jawaban lain). Ketika saya menghilangkannya, tar mencoba menambahkan sampah dari./
, termasuk jalur dari mulai dari./
.cd
pertama. Jawaban Anda mengatakan alat ini bekerja dengan cara yang berlawanan dengan bagaimana dokumen mengatakan itu bekerja dan bagaimana cara kerjanya pada sistem saya, jadi itu adalah jawaban yang salah. Anda dapat dengan mudah memperbaikinya.Perintah berikut akan membuat direktori root "." dan letakkan semua file dari direktori yang ditentukan ke dalamnya.
Jika Anda ingin meletakkan semua file di root dari file tar, @chinthaka benar. Cukup masuk ke direktori dan lakukan:
Ini akan menempatkan semua file di cwd ke file tar sebagai file root.
sumber
Menggunakan "titik" mengarah ke pembuatan folder bernama "titik" (di Ubuntu 16).
Saya membahas hal ini lebih terinci dan menyiapkan contoh. Rekaman multi-line, ditambah pengecualian.
sumber
.
, yang merupakan direktori saat ini. Dalam kontekstar.gz
struktur, itu hanya level dasar / root / atas, kan?Jika Anda ingin mengarsipkan subdirektori dan memangkas jalur subdirektori, perintah ini akan berguna:
sumber