Ada 5 file besar (file1, file2, .. file5) masing-masing sekitar 10G dan ruang kosong yang sangat rendah tersisa di disk dan saya harus menggabungkan semua file ini menjadi satu. Tidak perlu menyimpan file asli, hanya yang terakhir.
Rangkaian biasa berjalan dengan cat
berurutan untuk file file2
.. file5
:
cat file2 >> file1 ; rm file2
Sayangnya cara ini membutuhkan setidaknya 10G ruang kosong yang tidak saya miliki. Apakah ada cara untuk menggabungkan file tanpa menyalinnya tetapi memberitahu filesystem entah bagaimana file1 itu tidak berakhir pada akhir file1 asli dan berlanjut pada mulai file2?
ps. filesystem ext4 jika itu penting.
filesystems
files
buru-buru
sumber
sumber
nbd-server
.Jawaban:
AFAIK (sayangnya) tidak mungkin untuk memotong file dari awal (ini mungkin benar untuk alat standar tetapi untuk tingkat syscall lihat di sini ). Tetapi dengan menambahkan beberapa kerumitan Anda dapat menggunakan pemotongan normal (bersama dengan file jarang): Anda dapat menulis ke akhir file target tanpa harus menulis semua data di antaranya.
Mari kita asumsikan pertama kedua file tersebut tepat 5GiB (5120 MiB) dan Anda ingin memindahkan 100 MiB pada suatu waktu. Anda menjalankan loop yang terdiri dari
memotong file sumber dengan satu blok (membebaskan ruang disk)
Tapi cobalah dengan file tes yang lebih kecil dulu, tolong ...
Mungkin file-file tersebut tidak memiliki ukuran yang sama atau kelipatan dari ukuran blok. Dalam hal ini perhitungan offset menjadi lebih rumit.
seek_bytes
danskip_bytes
harus digunakan kemudian.Jika ini cara yang ingin Anda tuju tetapi butuh bantuan untuk perinciannya maka tanyakan lagi.
Peringatan
Tergantung pada
dd
ukuran blok file yang dihasilkan akan menjadi mimpi buruk fragmentasi.sumber
Alih-alih memecah file bersama menjadi satu file, mungkin mensimulasikan file tunggal dengan pipa bernama, jika program Anda tidak dapat menangani banyak file.
Seperti yang Hauke sarankan, losetup / dmsetup juga bisa berfungsi. Eksperimen cepat; Saya membuat 'file1..file4' dan dengan sedikit usaha, apakah:
Kemudian, / dev / dm-0 berisi perangkat blok virtual dengan file Anda sebagai konten.
Saya belum menguji ini dengan baik.
Suntingan lain: Ukuran file harus dapat dibagi rata oleh 512 atau Anda akan kehilangan beberapa data. Jika ya, berarti Anda baik-baik saja. Saya melihat dia juga mencatat bahwa di bawah ini.
sumber
dmsetup
ke perangkat blok virtual (yang memungkinkan operasi pencarian normal tetapi tidak menambahkan atau memotong). Jika ukuran file pertama bukan kelipatan 512 maka Anda harus menyalin sektor terakhir yang tidak lengkap dan byte pertama dari file kedua (dalam jumlah 512) ke file ketiga. Perangkat loop untuk file kedua akan dibutuhkan--offset
.Anda harus menulis sesuatu yang menyalin data dalam tandan yang paling besar sebesar jumlah ruang kosong yang Anda miliki. Seharusnya berfungsi seperti ini:
file2
(menggunakanpread()
dengan mencari sebelum membaca ke lokasi yang benar).file1
.fcntl(F_FREESP)
untuk membatalkan alokasi ruang darifile2
.sumber
fcntl(F_FREESP)
yang membebaskan ruang yang terkait dengan rentang byte file yang diberikan (itu membuatnya jarang).fcntl
halaman manual saya (2012-04-15).fallocate
syscall. Versi baru dari fallocate utilityutil-linux
memiliki antarmuka untuk itu.Saya tahu ini lebih merupakan solusi daripada apa yang Anda minta, tetapi itu akan mengatasi masalah Anda (dan dengan sedikit fragmentasi atau jilbab):
lalu
atau, jika Anda berpikir kompresi akan membantu:
Lalu (dan HANYA kemudian), akhirnya
sumber