Asumsikan saya memiliki kompresi tar-ball gzip compressedArchive.tgz (+100 file, total + 5gb).
Apa yang akan menjadi cara tercepat untuk menghapus semua entri yang cocok dengan pola nama file yang diberikan misalnya awalan * .jpg dan kemudian menyimpan sisa-sisa dalam gzip: ed tar-ball lagi?
Mengganti arsip lama atau membuat arsip baru tidak penting, mana yang tercepat.
Jawaban:
Dengan GNU
tar
, Anda dapat melakukan:Dengan
bsdtar
:(
pigz
menjadi versi multi-utasgzip
).Anda dapat menimpa file itu sendiri seperti:
Tapi itu cukup berisiko, terutama jika hasilnya lebih sedikit dikompresi daripada file asli (dalam hal ini, yang kedua
pigz
mungkin berakhir menimpa area file yang belum dibaca yang pertama).sumber
Jangan mengabaikan cara yang mudah: itu mungkin cukup cepat untuk tujuan Anda. Dengan avfs untuk mengakses arsip sebagai direktori:
Dengan alat yang lebih primitif, ekstrak terlebih dahulu file tidak termasuk
.jpg
file, lalu buat arsip baru.Jika tar Anda memiliki
--exclude
:Namun ini dapat memotong kepemilikan file dan mode jika Anda tidak menjalankannya sebagai root. Untuk hasil terbaik, gunakan direktori sementara pada sistem file cepat - tmpfs jika Anda memiliki yang cukup besar.
Dukungan bagi pengarsip untuk bertindak sebagai pass-through (yaitu membaca arsip dan menulis arsip) cenderung terbatas. Tar GNU dapat menghapus anggota dari arsip dengan
--delete
opsi operasi ("--delete
Opsi tersebut telah dilaporkan berfungsi dengan baik ketikatar
bertindak sebagai filter daristdin
kestdout
."), Dan itu mungkin opsi terbaik Anda.Anda dapat membuat filter arsip yang kuat dalam beberapa baris Python. Its
tarfile
perpustakaan dapat membaca dan menulis dari non-seekable sungai, dan Anda dapat menggunakan kode sewenang-wenang dengan Python untuk filter, rename, memodifikasi ...sumber
tar
, Anda mungkin ingin menambahkanp
opsi.Dengan tar yang ada di Mac OSX, Anda bisa melakukan ini:
sumber
Untuk melakukan ini, Anda mungkin harus mengekstrak semua isi file .tgz dalam direktori lokal lalu menghapus file yang tidak Anda inginkan kemudian mengkompres ulang file .tgz.
Ini lama dan Anda membutuhkan ruang disk yang cukup tetapi untuk yang terbaik dari pengetahuan saya, tidak ada cara lain untuk melakukannya.
Karena Anda sudah memiliki beberapa jalur seperti
/tmpdir/withalotofspace
itu yang memiliki ruang kosong yang cukup (periksa menggunakandf -h /tmpdir/withalotofspace
), Anda dapat melakukan sesuatu seperti ini:sumber
Saya suka jawabannya oleh @Gilles, kecuali itu bisa lebih disederhanakan. Setelah membuka ritsleting, misalnya
gunzip foo.tgz
file akanfoo.tar
dan file dapat dihapus dengantar -f foo.tar --delete file|directory
. Di bawah ini adalah contoh menghapus direktori dari file tar.Jenis file spesifik dapat ditemukan bersama
tar -tf foo.tar|egrep -i '.jpg$'
.sumber