J'ai récemment partiellement récupéré un disque défectueux de 2,5 To. ddrescue
créé une image, que je peux monter en mode boucle, 2.1To sont récupérés, 450 Go sont manquants, malheureusement répartis sur tout le disque.
Pour voir quels fichiers sont affectés, je pourrais utiliser filefrag -v
et consulter le fichier de carte généré par ddrescue
.
MAIS cela prendrait des siècles. J'ai découvert que, comme ce ne sont que des fichiers vidéo que je récupère, il ne faut pas s'attendre à de grandes zones de zéros, mais ils sont présents et ddrescue
ne lisent pas les données du disque.
Il me faudrait donc une commande pour analyser un fichier s'il y a un gros patch (arbitraire) de tous les zéros dans le fichier. En réalité, ils sont toujours un multiple de 512 octets et commencent toujours à une adresse de 512 octets. Existe-t-il une commande permettant d’analyser dans un fichier une telle séquence d’octets binaires (512 × '\ 0')?
ddrescue
contiendra exactement quelles zones n'ont pas été clonées. Vous pouvez également utiliser ddrescueview pour les voir.Réponses:
J'ai modifié la réponse de xenoid pour rechercher spécifiquement les octets nuls, sur la base de la réponse de cette autre question sur la façon de rechercher des octets nuls dans grep:
la source
Rechercher
grep
explicitement des caractères nuls m'échappe. Cependant, faire apparaître 512 caractères identiques consécutifs (ce qui est presque aussi improbable) est un peu plus simple:répertorie les fichiers contenant une séquence de 512 caractères identiques. Le
-a
paramètre est nécessaire pour faire correspondre les caractères nuls (sinon, ils sont considérés comme des caractères de fin de ligne et sont ignorés).la source
La réponse de xenoid trouvera probablement les fichiers concernés pour vous rapidement. Pour confirmer et analyser davantage, vous pouvez exécuter:
Cela fonctionne comme suit:
"file"
est ouvert et diffusé à la première commande.tr
convertit chaque caractère null eno
, chaque caractère non-null enL
.fold
insère une nouvelle ligne après 512 caractères. À ce moment, le flux peut être traité comme du texte pur.grep
prend les lignes qui ne contiennent pasL
et les imprime avec leurs numéros.cut
isole ces nombres (purgesooo…
).De cette façon, vous obtenez des nombres ordinaux de morceaux de 512 octets remplis de zéros. La numérotation commence par
1
. Passez la sortie àwc -l
pour voir combien de morceaux sont affectés dans un fichier donné.la source
Approche différente, donc une autre réponse de ma part.
Vous pouvez vous utiliser
ddrescue
pour rechercher des zéros. Utilisez--generate-mode
.( source )
Supposons que votre fichier provient
outfile
d'uneddrescue
exécution précédente . Nous ne pouvons pas l'utiliser commeinfile
(parce queddrescue
refuse de travailler quandinfile
etoutfile
sont le même fichier), nous avons besoin d'un fichier factice,/dev/zero
fera l'affaire. Pour trouver chaque zéro dont vous avez besoin-b 1
. C'est la commande (mapfile
ne doit pas exister):Chaque entrée avec
?
dans la liste des blocs de données à l'intérieur dumapfile
bloc signifie un bloc de zéros (-b 1
un seul zéro est aussi un bloc). Voir la structure du mapfile pourddrescue
. Vous pouvez ensuite récupérer des informations à partir du fichiermapfile
.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):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’
N
octets de longueur ou plus, vous devez disposer d’une taille de bloc d'au plusM=$(((N+1)/2))
octets (par exemple, au plus5
pourN=10
,6
pourN=11
). La commandegénérera un mapfile où chaque ligne
?
dans la liste des blocs de données signifie au moinsM
zéro (décalage correct), mais chaque portion deN
zéros (quel que soit son décalage) générera une telle ligne à coup sûr. Puisque deux blocs deM
sont au moinsN
, le raisonnement suivant s'applique:Prendre des lignes avec
?
de la liste des blocs de données,mapfile
, rappelez-vous que l'unité estM
) est0x2
supérieureN
ou égale à 0, vous avez ou plusieurs zéros à cette position;0x1
alors vous devriez enquêter davantage s'il y a au moins desN
zéros autour de cette position;N
zéros dans le fichier à coup sûr.Dans ce cas
va trouver et cartographier tous.
la source
Cela m’intriguait, car c’était quelque chose que j’avais parfois voulu, et j’ai fait quelques recherches pour proposer ce programme Python 3 .
J'ai exécuté la
wget
commande au bas de la page et cela fonctionne parfaitement (vous aurez peut-être besoin d'unesudo
, en fonction de vos autorisations). Par exemplegrep
, il offre de nombreuses options puissantes, y compris des recherches d’expression régulière: les exemples dans l’en-tête en montrent quelques-unes;bgrep --help
donne la liste complète.Pour votre utilisation, vous aurez besoin d'une chaîne d'exécution contenant 512 doubles zéros: ne les tapez pas, utilisez quelque chose comme:
Vous pouvez utiliser cette
-r
option pour parcourir une arborescence de répertoires complète.J'ai ajouté cette réponse, non pas parce que les autres sont inadéquats (j'ai particulièrement aimé l'ingéniosité de la séquence de commandes de Kamil Maciorowski), mais parce qu'elle peut être utile aux autres (comme moi) aux problèmes connexes qui rencontrent cette question.
la source