Sé que copiar o transferir lo que originalmente era un archivo disperso sin usar una utilidad que comprenda los archivos dispersos hará que se llenen los 'agujeros'. ¿Hay algún método o utilidad para convertir lo que alguna vez fue un archivo disperso de nuevo en disperso?
Por ejemplo:
crear archivo disperso:
% 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
¿Hay alguna manera de:
% 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
usuario25849
fuente
fuente
rsync -aS
.Respuestas:
Editar 2015
a partir de util-linux 2.25, la
fallocate
utilidad en Linux tiene una opción-d
/--dig-hole
para eso.Cavaría un hoyo por cada bloque lleno de ceros en el archivo
En sistemas más antiguos, puede hacerlo a mano:
Linux tiene una
FALLOC_FL_PUNCH_HOLE
opciónfallocate
que puede hacer esto. Encontré un script en github con un ejemplo:Usando FALLOC_FL_PUNCH_HOLE de Python
Lo modifiqué un poco para hacer lo que pediste: perforar agujeros en regiones de archivos que están llenos de ceros. Aquí está:
Usando FALLOC_FL_PUNCH_HOLE de Python para hacer agujeros en los archivos
Ejemplo:
Tenga en cuenta que
punch.py
solo encuentra bloques de 4096 bytes para perforar, por lo que es posible que no haga que un archivo sea tan escaso como cuando comenzó. Podría hacerse más inteligente, por supuesto. Además, solo está ligeramente probado , así que tenga cuidado y haga copias de seguridad antes de confiar en él.fuente
Si desea que un archivo sea escaso, puede hacerlo directamente con
dd
.Del
dd(1)
manual:Entonces, tenga en cuenta que buscará hacia adelante solo si todo el bloque está vacío. Para un uso máximo de escasez
bs=1
.fuente
bs=512
realmente no tiene sentido, ya que los discos son dispositivos de bloque. (bs=4096
en unidades más nuevas)cp --sparse=always zeropadded.iso isnowsparse.iso
A menos que lo
tar
active con una-S
bandera (suponiendo GNU tar), y vuelva a ejecutar elscp
... no. Ninguna utilidad que conozco tendría una manera de saber dónde estaban los "agujeros".fuente
He tenido buena suerte con esto:
Las
-I
fuerzas de rsync para actualizar todos los archivos, independientemente de si se piensa que han cambiado o no; la-S
causa de los nuevos archivos que se sparsified.-a
hace que suceda de forma recursiva para que pueda esparcir árboles de directorios completos en un solo comando.No es tan bueno como una herramienta a medida que busca agujeros y los destruye
FALLOC_FL_PUNCH_HOLE
, pero es mejor que tener que duplicar árboles de directorios completos.fuente