Saya tahu bahwa menyalin atau mentransfer apa yang awalnya merupakan file jarang tanpa menggunakan utilitas yang mengerti file jarang akan menyebabkan 'lubang' diisi. Apakah ada metode atau utilitas untuk mengubah file yang tadinya jarang menjadi kembali?
Sebagai Contoh:
buat file jarang:
% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
Apakah ada cara untuk:
% resparse TEST2
to get:
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
files
utilities
sparse-files
pengguna25849
sumber
sumber
rsync -aS
.Jawaban:
Edit 2015
pada util-linux 2.25,
fallocate
utilitas di Linux memiliki-d
/--dig-hole
opsi untuk itu.Akan menggali lubang untuk setiap blok yang penuh dengan nol dalam file
Pada sistem yang lebih lama, Anda dapat melakukannya dengan tangan:
Linux memiliki
FALLOC_FL_PUNCH_HOLE
opsi untukfallocate
dapat melakukan ini. Saya menemukan skrip di github dengan contoh:Menggunakan FALLOC_FL_PUNCH_HOLE dari Python
Saya memodifikasinya sedikit untuk melakukan apa yang Anda minta - membuat lubang di wilayah file yang diisi dengan nol. Ini dia:
Menggunakan FALLOC_FL_PUNCH_HOLE dari Python untuk membuat lubang pada file
Contoh:
Perhatikan bahwa
punch.py
hanya menemukan blok 4096 byte yang dapat dilempar keluar, sehingga mungkin tidak membuat file persis seperti ketika Anda mulai. Itu bisa dibuat lebih pintar, tentu saja. Juga, ini hanya diuji ringan , jadi hati-hati dan buat cadangan sebelum mempercayainya!sumber
Jika Anda ingin membuat file jarang, Anda dapat melakukannya langsung dengan
dd
.Dari
dd(1)
manual:Jadi, perhatikan bahwa ia akan mencari ke depan hanya jika seluruh blok kosong. Untuk penggunaan sparseness maksimum
bs=1
.sumber
bs=512
tidak terlalu masuk akal, karena disk adalah perangkat blok. (bs=4096
dalam drive yang lebih baru)cp --sparse=always zeropadded.iso isnowsparse.iso
Pendek-
tar
up dengan-S
bendera (dengan asumsi GNU tar), dan menjalankan kembaliscp
... no. Tidak ada utilitas yang saya tahu akan memiliki cara untuk mengetahui di mana "lubang" berada.sumber
Saya beruntung dengan ini:
The
-I
pasukan rsync untuk memperbarui semua file, terlepas dari apakah itu mengira mereka telah berubah atau tidak; yang-S
menyebabkan file baru akan disebarkan.-a
membuatnya terjadi secara rekursif sehingga Anda dapat menyebarkan seluruh pohon direktori dalam satu perintah.Ini tidak sebagus alat yang dipesan lebih dahulu yang mencari lubang dan menghancurkannya
FALLOC_FL_PUNCH_HOLE
, tetapi lebih baik daripada harus menduplikasi seluruh pohon direktori.sumber