Approche différente, donc une autre réponse de ma part.
Vous pouvez vous utiliser ddrescuepour rechercher des zéros. Utilisez --generate-mode.
Quand ddrescueest appelé avec l' --generate-modeoption, il fonctionne en "mode de génération", ce qui diffère du "mode de secours" par défaut. C'est-à-dire que si vous utilisez l' --generate-modeoption, ddrescuerien ne sera sauvé. Il essaie seulement de générer un mapfilepour une utilisation ultérieure.
[…]
ddrescuepeut dans certains cas générer une copie approximative mapfile, à partir de infileet la copie (partielle) outfile, qui est presque aussi bonne qu’une copie exacte mapfile. Cela se fait simplement en supposant que les secteurs contenant tous les zéros n’ont pas été sauvés.
[…]
ddrescue --generate-mode infile outfile mapfile
( source )
Supposons que votre fichier provient outfiled'une ddrescueexécution précédente . Nous ne pouvons pas l'utiliser comme infile(parce que ddrescuerefuse de travailler quand infileet outfilesont le même fichier), nous avons besoin d'un fichier factice, /dev/zerofera l'affaire. Pour trouver chaque zéro dont vous avez besoin -b 1. C'est la commande ( mapfilene doit pas exister):
ddrescue -b 1 --generate-mode /dev/zero file mapfile
Chaque entrée avec ?dans la liste des blocs de données à l'intérieur du mapfilebloc signifie un bloc de zéros ( -b 1un seul zéro est aussi un bloc). Voir la structure du mapfile pourddrescue . Vous pouvez ensuite récupérer des informations à partir du fichier mapfile.
Par exemple, la commande suivante vous donnera la longueur (hexadécimale, en octets à cause de -b 1) du plus grand bloc de zéros (une sortie vide signifie qu'il n'y en avait pas):
grep '0x.*0x.*[?]' mapfile | awk -F ' ' '{print $2}' | sort -ru | head -n 1
Pour accélérer les choses, vous pouvez utiliser une taille de bloc plus grande ( -b), mais les blocs de zéros commençant par un bloc et se terminant par le suivant peuvent ne pas être remarqués, même s’ils sont légèrement plus longs que la taille de bloc choisie; leur décalage devient important.
Pour ne rater aucune portion de zéros d’ Noctets de longueur ou plus, vous devez disposer d’une taille de bloc d'au plus M=$(((N+1)/2))octets (par exemple, au plus 5pour N=10, 6pour N=11). La commande
ddrescue -b "$M" --generate-mode /dev/zero file mapfile
générera un mapfile où chaque ligne ?dans la liste des blocs de données signifie au moins Mzéro (décalage correct), mais chaque portion de Nzéros (quel que soit son décalage) générera une telle ligne à coup sûr. Puisque deux blocs de Msont au moins N, le raisonnement suivant s'applique:
Prendre des lignes avec ?de la liste des blocs de données,
- Si la longueur (deuxième colonne de la
mapfile, rappelez-vous que l'unité est M) est 0x2supérieure Nou égale à 0, vous avez ou plusieurs zéros à cette position;
- si la longueur est
0x1alors vous devriez enquêter davantage s'il y a au moins des Nzéros autour de cette position;
- s'il n'y a pas de telle ligne, il n'y a pas de
Nzéros dans le fichier à coup sûr.
En réalité, ils seraient toujours un multiple de 512 octets et commenceraient toujours à une adresse de 512 octets.
Dans ce cas
ddrescue -b 512 --generate-mode /dev/zero file mapfile
va trouver et cartographier tous.
ddrescuecontiendra exactement quelles zones n'ont pas été clonées. Vous pouvez également utiliser ddrescueview pour les voir.