Saya punya sedikit dilema di sini ...
Saya perlu memindahkan sekitar 70 GB nilai file dari satu server saya ke yang lain, jadi saya memutuskan bahwa menaruhnya dan mengirimkan arsip akan menjadi cara tercepat.
Namun, server penerima hanya memiliki 5 GB ruang tersisa setelah menerima arsip tar.
Apakah ada cara saya bisa mengekstrak tar 'di tempat'? Saya tidak perlu menyimpan arsip setelah diekstraksi, jadi saya bertanya-tanya apakah mungkin untuk melakukan ini.
Sunting: Perlu dicatat bahwa arsip telah dikirim, dan saya ingin menghindari mengirim ulang melalui metode yang berbeda.
Jika mesin lain memiliki ssh, saya akan merekomendasikan Anda rsync sebagai alternatif lain yang tidak menggunakan file tar:
Dan hati-hati dengan yang terdepan
/
Edit pembaruan
Yah, saya melihat bagaimana ini sekarang acar yang baik jika Anda tidak dapat menghapusnya dan memulai kembali dengan rsync. Saya mungkin akan mencoba ekstrak selektif dan menghapus dari tar.
ekstrak selektif:
hapus selektif:
Namun, tampaknya Anda akan menghabiskan banyak waktu untuk menulis naskah untuk ...
sumber
Pada dasarnya, yang Anda butuhkan adalah kemungkinan untuk mem-pipe file ke tar, dan "buka" bagian depan saat Anda menggunakannya.
Pada StackOverflow, seseorang bertanya bagaimana memotong file di depan , tetapi sepertinya itu tidak mungkin. Anda masih dapat mengisi awal file dengan nol dengan cara khusus sehingga file menjadi file yang jarang , tetapi saya tidak tahu bagaimana melakukan ini. Kami dapat memotong bagian akhir file. Tetapi tar perlu membaca arsip ke depan, bukan ke belakang.
Solusi 1
Tingkat tipuan menyelesaikan setiap masalah. Pertama-tama balikkan file di tempat, kemudian bacalah mundur (yang akan menghasilkan membaca file asli ke depan) dan memotong ujung file terbalik saat Anda pergi.
Anda harus menulis sebuah program (c, python, apa pun) untuk bertukar awal dan akhir file, chunk by chunk, dan kemudian pipa chunk ini ke tar sambil memotong file chunk sekaligus. Ini adalah dasar untuk solusi 2 yang mungkin lebih mudah diterapkan.
Solusi 2
Metode lain adalah dengan membagi file menjadi potongan-potongan kecil di tempat , lalu hapus potongan-potongan itu saat kita mengekstraknya. Kode di bawah ini memiliki ukuran chunk satu megabyte, sesuaikan tergantung kebutuhan Anda. Lebih besar lebih cepat tetapi akan membutuhkan lebih banyak ruang antara saat pemisahan dan selama ekstraksi.
Pisahkan file archive.tar:
Pipa file-file itu ke tar (perhatikan kita perlu variabel chunkprefix di terminal kedua):
Karena kami menggunakan pipa bernama (
mkfifo fifo
), Anda tidak harus mem-pipe semua chunks sekaligus. Ini bisa bermanfaat jika Anda benar-benar kekurangan ruang. Anda dapat mengikuti langkah-langkah berikut:while [ -e … ]; do cat "$chunk…; done
loop telah selesai (terminal kedua):tar
perintah, JANGAN menghapus fifo (terminal pertama), tetapi Anda dapat menjalankansync
, untuk berjaga-jaga,while [ -e … ]; do cat "$chunk…; done
garis lagi.Tentu saja ini semua haute voltige , Anda akan ingin memeriksa semuanya ok pada arsip dummy terlebih dahulu, karena jika Anda melakukan kesalahan maka selamat tinggal data .
Anda tidak akan pernah tahu apakah terminal pertama (
tar
) telah benar-benar selesai memproses konten fifo, jadi jika Anda lebih suka Anda dapat menjalankan ini sebagai gantinya, tetapi Anda tidak akan memiliki kemungkinan untuk bertukar potongan tanpa cacat dengan disk lain:Penolakan
Perhatikan bahwa agar semua ini berfungsi, shell, tail, dan truncate Anda harus menangani integer 64-bit dengan benar (Anda tidak memerlukan komputer 64-bit atau sistem operasi untuk itu). Milik saya, tetapi jika Anda menjalankan skrip di atas pada sistem tanpa persyaratan ini, Anda akan kehilangan semua data di archive.tar .
Dan dalam hal apa pun selain yang salah, Anda akan kehilangan semua data di archive.tar, jadi pastikan Anda memiliki cadangan data Anda.
sumber
Jika Anda memiliki file objek yang akan dipindahkan, cobalah menghapusnya. Ini akan menghemat banyak ruang.
sumber