Pertimbangkan file tar tunggal dari sistem eksternal yang berisi beberapa direktori dengan berbagai atribut yang ingin saya pertahankan seperti izin, mtimes, dll. Bagaimana saya dapat dengan mudah mengambil subset dari file-file ini sebagai pengguna biasa (bukan root)?
Mencari sesuatu seperti:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Juga penting bahwa atribut utama (kepemilikan, grup, mode, mtime) dalam arsip tar ini dipertahankan. Bagaimana dengan atribut lain dalam file tar seperti kata kunci header yang diperluas ?
Poin bonus untuk solusi yang menghindari penggunaan direktori sementara jika subdir ini berisi file besar.
@original.tar
pendekatan ini dimungkinkan dengan bsdtar. Tampaknya bekerja dengan atribut yang diperluas dan kompresi juga,</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(dan karena alasan tertentu pilihan kosong menghasilkan serangkaian nol byte, tapi itu bukan masalah besar bagi saya).s/old/new/
tidak berfungsi pada file yang berasal dari arsip lama menggunakan @ old.tgz, itu hanya bekerja pada file nyata, pengarsipan langsung dari sistem file. Sungguh memalukan, karena itu akan menjadi kasus penggunaan yang paling berguna bagi saya.Cara termudah adalah menyalin seluruh arsip; Saya kira Anda tidak ingin melakukan itu karena terlalu besar.
Alat baris perintah yang biasa (
tar
,pax
) tidak mendukung menyalin anggota arsip ke arsip lain.Jika Anda tidak perlu mempertahankan kepemilikan, saya sarankan menggunakan filesystem FUSE . Anda dapat menggunakan archivemount untuk me-mount arsip sebagai sistem file; lakukan ini untuk arsip sumber, dan jalankan tar pada sistem file yang terpasang.
Atau, Anda dapat menggunakan AVFS :
Atau, Anda dapat menjalankan
tar
arsip asli dan mengekstrak ke mesin jarak jauh melalui SSHFS .Namun semua metode ini rumit jika Anda perlu mempertahankan kepemilikan. Semuanya melibatkan pengekstrakan ke file di mesin lokal, jadi kepemilikan file ini harus menjadi kepemilikan jarak jauh yang dimaksud . Ini membutuhkan berjalan sebagai root dan mungkin tidak memberikan hasil yang dimaksudkan jika file dimiliki oleh akun yang memiliki nama atau ID yang berbeda antara mesin lokal dan host jarak jauh.
tarfile
Pustaka Python menyediakan cara yang cukup mudah untuk memanipulasi anggota tar, sehingga Anda dapat mengocoknya dari satu file tar ke yang lain. Ini mendukung format standar POSIX (ustar, pax) serta beberapa ekstensi GNU. Berikut ini adalah skrip Python yang belum teruji yang membaca file tar (mungkin dikompres dengan gzip atau bzip2) pada input standarnya dan menulis file tar yang dikompres dengan bzip2 pada output standarnya. Anggota dari sumber disalin jika mereka mulai dengan argumen yang diteruskan ke skrip.Untuk dipanggil sebagai
sumber
Pendekatan alternatif tanpa hak istimewa adalah menggunakan
fakeroot
program untuk berpura-pura bahwa Anda diizinkan mengubah kepemilikan. Sementara atribut tar lainnya hilang, ia tetap mempertahankan mode, mtime dan uid / gid. Perintah-perintah ini membuat direktori sementara, mengekstrak subset dari file dan akhirnya membuat arsip baru:sumber
GNU
tar
memang memiliki--delete
opsi:Dengan cara ini, Anda bisa mendapatkan subset dari tar input dengan menentukan apa yang tidak termasuk dalam output.
Sayangnya saya tidak bisa mendapatkan
--exclude
opsi untuk bekerja--delete
, jadi sepertinya Anda pertama-tama perlu mendapatkan daftar eksplisit (-t
) hal-hal untuk dihapus dan kemudian meneruskannya ke permohonan laintar
.Atau Anda dapat menyimpan daftar dalam file eksternal jika terlalu panjang atau rumit:
sumber
Dari yang saya tahu,
tar
perintah tidak bisa menggunakan format tar baik sebagai input dan output. Anda harus mengekstrak file Anda secara lokal entah bagaimana, dan menggunakan tar lagi untuk membuat tarfile on-the-fly, dengan sesuatu seperti ini (-
sarana input / output standar digunakan sebagai pengganti file):Perhatikan bahwa memiliki
tar
kemampuan mengekstrak tarfile langsung di tarfile lain adalah ide yang menarik ...sumber