Saya mendapatkan drive 100GB yang memiliki file 95GB. Saya perlu mengosongkan ruang di drive (dan sekarang mentransfer file dari drive bukan pilihan). File akan dikompres dengan baik dengan gzip
atau bz2
atau apa pun, tetapi semua program ini menulis file terkompresi ke file terpisah. Saya tidak punya cukup ruang kosong untuk ini.
Apakah ada cara menggunakan alat kompresi standar atau utilitas Unix lainnya untuk mengompres file tanpa menggunakan ruang disk tambahan (atau setidaknya ruang disk tambahan minimal)? Saya membayangkan sesuatu yang mengkompres bagian file sekaligus dan menulis hasilnya langsung di atas file. Saya menyadari ini akan berisiko, karena file akan rusak jika kompresi terputus, tetapi saya rasa saya tidak punya pilihan.
linux
compression
Lee
sumber
sumber
Jawaban:
Ini adalah bukti dari konsep bash one-liner, tetapi harus membantu Anda memulainya. Gunakan dengan risiko Anda sendiri.
Ini bekerja dengan memipakan data gz ke proses dd yang menulisnya kembali ke file yang sama. Setelah selesai, file dipotong ke ukuran output gz.
Ini mengasumsikan bahwa baris terakhir dari output dd cocok:
Di mana bidang pertama adalah integer byte yang ditulis. Ini adalah ukuran file yang harus dipotong. Saya tidak 100% yakin bahwa format output selalu sama.
sumber
conv=notrunc
itu perlu?gzip -c file | dd of=file
tampaknya bekerja juga.gzip
) menulis lebih banyak header dan byte data daripada byte data asli, sehingga menimpa beberapa bagian file? Saya kira ini tergantung pada program kompresi yang dipilih. Adakah yang tahu bagaimana mencegah hal ini terjadi atau bagaimana kemungkinannya?Ini tidak begitu banyak
gzip
danbzip2
menimpa yang asli. Sebaliknya, mereka menulis data terkompresi ke disk sebagai file baru, dan jika operasi itu berhasil, mereka memutuskan tautan file asli yang tidak terkompresi.Jika Anda memiliki RAM yang cukup, Anda dapat menulis skrip untuk mengompresi sementara file dalam
tmpfs
sistem file, kemudian menghapus yang asli pada disk dan menggantinya dengan versi terkompresi. Mungkin kira-kira seperti ini:Berhati-hatilah dengan penggunaan memori Anda, karena
tmpfs
pada dasarnya ini adalah disk RAM. File keluaran besar dapat dengan mudah membuat sistem kelaparan dan menyebabkan masalah lain bagi Anda.sumber
Tidak ada alat yang bekerja dengan cara ini, untuk alasan yang Anda berikan. Hanya sedikit orang yang mau menulis alat yang dengan sengaja menerapkan perilaku berisiko.
sumber
Perintah split dan csplit dapat digunakan untuk membagi file besar menjadi bagian-bagian yang lebih kecil, dan kemudian kompres secara individual. Merangkai kembali akan memakan waktu.
sumber