Introduction
Je suis amené régulièrement à réaliser des récupérations de fichiers sur des supports effacés ou défectueux. Un des logiciels que j’utilise est Photorec.
PhotoRec est un programme de récupération de données conçu pour récupérer des images perdues provenant de carte mémoire d’appareil photo, d’où le nom de PhotoRec provenant de l’anglais Photo Recovery. Il peut aussi récupérer de nombreux fichiers perdus, tels que de la vidéo, des documents et des archives stockés sur un disque dur ou sur un CD-ROM.
PhotoRec ignore le système de fichiers et va directement aux données fondamentales, il devrait donc fonctionner même si le système de fichiers est sévèrement endommagé ou formaté. PhotoRec est sûr d’utilisation, il n’essayera jamais d’écrire sur votre disque dur ou autre support mémoire que vous voulez récupérer. Les fichiers récupérés seront écrits sur le disque dur où vous exécutez PhotoRec.
Photorec crée sur le disque un ensemble de dossiers contenant l’ensemble des fichiers dumpés.
La demande la plus récurrente qui m’est formulée est de récupérer des photos perdues ou effacées par inadvertance. Il faut donc un script qui parcourt l’ensemble des dossiers pour en extraire les photos qui nous intéressent (celles qui disposent d’une taille raisonnable de visualisation).
Le script Python pyphotorec.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Help to sort files from PhotoRec
"""
from multiprocessing import Pool
import path
from PIL import Image
IN = "/mnt/big/DISQUE_DUMP/"
OU = "/mnt/big/DISQUE_DUMP_JPG/"
WIDTH = 240
HEIGHT = 180
def get_jpg(folder):
initfolder = path.path(folder)
folders = [elem for elem in initfolder.dirs()]
return [f for elem in folders for f in elem.files('*.jpg')]
def copy_jpg(filename):
p = path.path(filename)
fbase = p.basename()
im = Image.open(filename)
fwidth, fheight = im.size
if fwidth > WIDTH and fheight > HEIGHT:
im.save(OU + fbase, "JPEG")
print fbase, "=> Image saved"
if __name__ == "__main__":
pool = Pool()
pool.map(copy_jpg, get_jpg(IN))
pool.close()
pool.join()
Remarques
La lecture du script n’oppose pas de difficulté particulière. La notion intéressante dans ce script est l’utilisation de la fonction map() et du multiprocessing pour paralléliser les traitements.