Hapus file dari arsip tar

17

Saya memiliki file besar foo.tar.xzyang berisi banyak (katakanlah 200000) file. Saya menemukan bahwa arsip ini berisi beberapa (sekitar 5000) file yang tidak saya inginkan. Saya tidak memiliki ruang disk yang cukup untuk mendekompres semuanya ke disk saya; selain itu, saya khawatir atribut / hak mungkin hilang jika saya melakukannya. Saya memiliki cukup ruang untuk menampung dua salinan arsip terkompresi . Apakah ada alat untuk menghapus beberapa file dari arsip (ditentukan dengan regex pada nama file) dengan cepat, yaitu tanpa membongkar arsip ke dalam file individual?

FUZxxl
sumber

Jawaban:

15

GNU tar memiliki --deleteopsi yang bekerja dengan arsip juga saat ini.

Gunakan seperti ini, misalnya:

tar -vf yourArchive.tar --delete your/path/to/delete

Hati-hati: Ini kemungkinan besar tidak akan bekerja pada segala jenis media pita magnetik. Tetapi tartidak memiliki masalah bekerja dalam pipa, jadi Anda bisa menggunakan file tar sementara dan menimpa rekaman dengan itu setelahnya. Ini juga tidak akan berfungsi pada file yang dikompresi, jadi Anda harus mengompres file tersebut.

Juga, operasi akan agak lambat dalam hal apa pun, karena (dengan desain) sifat linear dikemas arsip tar.

Evi1M4chine
sumber
1
Memang ada, tetapi tidak bekerja dengan file di mana akses acak tidak mungkin (misalnya arsip kompres) tapi ini adalah kasus penggunaan saya.
FUZxxl
1
Masalah lainnya adalah bahwa saya tidak dapat menentukan pola untuk dihapus. Catat komentar saya dari 2013 di mana saya sudah membahas kekurangan gtar --delete.
FUZxxl
4
@FUZxxl -Tbekerja dengan --delete, dan --wildcardsmemungkinkan Anda untuk menggunakan pola daripada nama file, jadi buat file sementara yang berisi pola dan penggunaan unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Itu tidak akan melakukan regex lengkap (jika Anda membutuhkannya, cukup gunakan tar -tdan buat daftar nama file yang akan dihapus), cukup pola nama file yang cocok.
Random832
14

(diedit, karena saya salah mengerti pertanyaan, yang sejak itu diedit juga)

Yang terbaik yang dapat Anda lakukan adalah mengekstrak, menghapus, dan mengkompres ulang seluruh file.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Tidak mungkin menghapus file dari tar secara langsung.

tar adalah aliran, awalnya ditujukan untuk tape drive yang tidak melakukan pencarian acak dengan baik - sementara secara teori bisa dimungkinkan pada sistem file disk untuk melubangi / menulis ulang file yang tersisa, dengan kompresi, titik tersebut dapat diperdebatkan seperti kebanyakan jika tidak semua Metode kompresi sangat bergantung pada konten yang terjadi sebelumnya dalam file. Untuk melakukan ini di tempat Anda akan memerlukan pengetahuan yang sangat rinci tentang kedua metode kompresi serta format file tar. Kompleksitas ke titik yang tak seorang pun akan peduli dengan itu. Lebih murah hanya menyimpan file di sekitarnya dan mengabaikannya.

Jika Anda membutuhkan fungsi ini, tar mungkin bukan yang Anda inginkan.

frostschutz
sumber
File-file itu berukuran 35% dari ukuran arsip. Pembatasan yang Anda tunjukkan tampaknya hanya berlaku jika saya menulis ulang file, tidak jika saya memodifikasinya tidak pada tempatnya, yang dapat saya lakukan (saya memiliki cukup ruang untuk menyimpan arsip yang dikemas dua kali). Apakah ada alat seperti itu?
FUZxxl
Saya mungkin salah mengerti pertanyaan Anda kalau begitu. Jika Anda memang ingin membongkar tar, dan mengemasnya kembali, (hanya tanpa benar-benar membuat file tar - yaitu, tar langsung ke pipa tar), itu mungkin.
frostschutz
Ya, saya bisa melakukan itu. Hanya saja file-file tersebut memiliki uids / gids / atribut yang perlu saya pertahankan. Juga, saya tidak memiliki cukup ruang disk untuk menyimpan representasi yang belum dibongkar. Saya memiliki cukup ruang untuk menyimpan dua arsip yang dikemas.
FUZxxl
1
Itu tidak masalah sama sekali. Jika saya bisa melakukan ini dalam satu jalan, waktu tidak akan terlalu lama. Saya tidak bisa membayangkan format arsip apa pun yang memungkinkan untuk dihapus dengan cepat sementara sebenarnya melepaskan penyimpanan.
FUZxxl
1
--wildcardstolong ... saya harus memasukkan ./pada awal pola meskipun ...
Gert van den Berg
-4

Menurut manual , Anda dapat memberikan daftar nama file taruntuk hanya mengekstraknya. Sebagai contoh:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo
Don Juan dePython
sumber
Saya tidak melihat bagaimana --extract membantu saya. Bisakah Anda menguraikan? Harap diingat bahwa saya tidak dapat membongkar arsip (atau sebagian besar arsip itu) ke disk.
FUZxxl
2
Tolong jangan hanya mengirim tautan: ini adalah wiki - tambahkan konten yang cukup agar tidak perlu orang meninggalkan halaman untuk memahami jawaban Anda.
jasonwryan