Nettoyage Métadonnées

Documentation technique complète pour mettre en place un outil de nettoyage de métadonnées (fichiers Office, PDF, Vidéos, Images).

🧹
Technologies
Bash Python 3 ExifTool FFmpeg QPDF
Difficulté ⭐⭐ Intermédiaire
Étapes 8 étapes
Statut ✓ Complet
Auteur bougui.fr
Préparation du système
1

Mise à jour et installation des paquets

Avant toute chose, mettez à jour votre système et installez les dépendances nécessaires au traitement des différents formats de fichiers.

bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y libimage-exiftool-perl ffmpeg qpdf python3-pip
2

Création de l'environnement de travail

On crée le dossier principal sur le Bureau qui va contenir tous nos scripts et les fichiers à traiter.

bash
cd ~/Bureau
mkdir Nettoyage_Metadonnees
cd Nettoyage_Metadonnees
3

Configuration de l'environnement Python

Création d'un environnement virtuel Python et installation des bibliothèques nécessaires pour manipuler les documents Office.

bash
sudo apt install python3-venv
python3 -m venv env_cleaner
source env_cleaner/bin/activate
pip install python-docx python-pptx openpyxl
4

Création du dossier et préparation

Créez le dossier qui va recevoir les fichiers à nettoyer, puis créez le fichier bash de lancement.

bash
mkdir a_nettoyer
nano lancer.sh
Les Scripts
5

Script principal (lancer.sh)

Copiez ce contenu exact dans le fichier lancer.sh. Ce script s'occupe de lancer Python, trouver la clé USB et déplacer les fichiers finaux.

bash
#!/bin/bash

# Partie 1 ---- lancer du nettoyage
cd "$(dirname "$0")"
source env_cleaner/bin/activate
python3 script_nettoyage.py

# Partie 2 ---- recherche USB pour couper/coller
user=$(whoami)
CLE_PATH=$(ls /media/$user/ 2>/dev/null | head -n 1)
if [ -z $CLE_PATH ]; then
echo "ATTENTION : Aucune clé USB détectée."
echo "Les fichiers resent dans le dossier 'fichiers_propres' sur l'ordinateur."
else
NOM_DOSSIER="Nettoyage_$(date +%Hh%M_%d-%m-%Y)"
DESTINATION=/media/$user/$CLE_PATH/$NOM_DOSSIER
echo "Clé détectée : $CLE_PATH"
echo "Dépacement des fichiers vers la clé..."
mkdir -p "$DESTINATION"
mv ./fichiers_propres/* $DESTINATION/ 2>/dev/null
mv ./nettoyage_complet.log $DESTINATION 2>/dev/null
echo "Tout a été déplacé sur la clé."
fi

# Partie 3 ---- nettoyage du répertoire a_nettoyer
echo "----------------------------------"
echo "Voulez-vous vider le dossier 'a_nettoyer' ? (o/n)"
read confirmation
if [ "$confirmation" = "o" ]; then
rm -rf ./a_nettoyer/*
echo "Dossier 'a_nettoyer' vidé."
fi
echo "----------------------------------"
echo "Traitement terminé. Appuyer sur Entrée."
read
6

Droits d'exécution

Rendez votre script bash exécutable pour pouvoir le lancer facilement par la suite.

bash
chmod +x lancer.sh
ℹ️
Note Il faut bien s'assurer que le script de nettoyage est copié dans le répertoire Nettoyage_Metadonnees (sur le bureau).
7

Script Python de Nettoyage

Créez le fichier script_nettoyage.py dans le dossier principal et copiez-y le code ci-dessous.

python
import os
import shutil
import subprocess
import logging
from pathlib import Path

# Imports pour les documents Office
from docx import Document
from pptx import Presentation
import openpyxl

# --- CONFIGURATION ---
SOURCE_DIR = "./a_nettoyer"
OUTPUT_DIR = "./fichiers_propres"
LOG_FILE = "nettoyage_complet.log"
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[logging.FileHandler(LOG_FILE), logging.StreamHandler()]
)

# --- FONCTIONS DE NETTOYAGE OFFICE ---
def clean_docx(path):
    doc = Document(path)
    p = doc.core_properties
    p.author = p.category = p.comments = p.content_status = ""
    p.identifier = p.keywords = p.language = p.last_modified_by = ""
    p.subject = p.title = p.version = ""
    doc.save(path)
def clean_pptx(path):
    prs = Presentation(path)
    p = prs.core_properties
    p.author = p.category = p.comments = p.content_status = ""
    p.identifier = p.keywords = p.language = p.last_modified_by = ""
    p.subject = p.title = p.version = ""
    prs.save(path)
def clean_xlsx(path):
    wb = openpyxl.load_workbook(path)
    p = wb.properties
    p.creator = p.title = p.description = p.subject = ""
    p.keywords = p.category = p.contentStatus = ""
    p.lastModifiedBy = p.identifier = p.language = ""
    wb.save(path)

# --- FONCTIONS SYSTÈME (IMAGE, VIDEO, PDF) ---
def clean_generic_exif(path):
    """Utilisé pour Images et vieux formats (.doc, .xls)"""
    cmd = ['exiftool', '-all=', '-overwrite_original', str(path)]
    subprocess.run(cmd, capture_output=True)
def clean_video(in_path, out_path):
    """Vidéo sans perte (copy stream)"""
    cmd = ['ffmpeg', '-y', '-i', str(in_path), '-map_metadata', '-1', '-c', 'copy', str(out_path)]
    subprocess.run(cmd, capture_output=True)
def clean_pdf(path):
    """Nettoyage PDF via QPDF"""
    cmd = ['qpdf', '--linearize', '--replace-input', str(path)]
    subprocess.run(cmd, capture_output=True)

# --- BOUCLE PRINCIPALE ---
def process_all():
    src_base = Path(SOURCE_DIR).resolve()
    out_base = Path(OUTPUT_DIR).resolve()

for root, _, files in os.walk(src_base):
    for file_name in files:
        file_path = Path(root) / file_name
        rel_path = file_path.relative_to(src_base)
        target_path = out_base / rel_path

        target_path.parent.mkdir(parents=True, exist_ok=True)
        ext = file_path.suffix.lower()

        try:
            # 1. VIDÉOS (Traitement spécial car nécessite un fichier de sortie différent)
            if ext in ['.mp4', '.mkv', '.mov', '.avi']:
                clean_video(file_path, target_path)
                logging.info(f"[VIDEO] Nettoyé : {rel_path}")
                continue

            # 2. COPIE DU FICHIER VERS DESTINATION (Avant modification)
            shutil.copy2(file_path, target_path)

            # 3. TRAITEMENT SELON EXTENSION
            if ext == '.docx':
                clean_docx(target_path)
                logging.info(f"[OFFICE] Docx nettoyé : {rel_path}")
            elif ext == '.pptx':
                clean_pptx(target_path)
                logging.info(f"[OFFICE] Pptx nettoyé : {rel_path}")
            elif ext == '.xlsx':
                clean_xlsx(target_path)
                logging.info(f"[OFFICE] Xlsx nettoyé : {rel_path}")
            elif ext == '.pdf':
                clean_generic_exif(target_path)
                clean_pdf(target_path)
                logging.info(f"[PDF] Nettoyé : {rel_path}")
            elif ext in ['.jpg', '.jpeg', '.png', '.tiff', '.doc', '.xls', '.ppt']:
                clean_generic_exif(target_path)
                logging.info(f"[EXIF] Nettoyé (Image/OldOffice) : {rel_path}")
            else:
                logging.info(f"[COPIE] Format non géré, copié tel quel : {rel_path}")

        except Exception as e:
            logging.error(f"[ERREUR] Impossible de nettoyer {rel_path} : {str(e)}")
            # En cas d'erreur de la lib Python, on assure au moins une copie brute
            if not target_path.exists():
                shutil.copy2(file_path, target_path)
if __name__ == "__main__":
    if not Path(SOURCE_DIR).exists():
        print(f"Dossier {SOURCE_DIR} introuvable.")
    else:
        process_all()
        print(f"Terminé. Arborescence créée dans {OUTPUT_DIR}")
Mode d'utilisation
8

Mode de fonctionnement

Voici la procédure complète pour utiliser votre outil de nettoyage :

💾
1. Préparation

Branchez une clé USB avec vos documents ou répertoires à nettoyer. Copiez-les dans le dossier a_nettoyer (sur le Bureau).

▶️
2. Exécution

Faites un clic droit sur lancer.sh et choisissez "Exécuter comme programme". Suivez les instructions à l'écran.

3. Finalisation

Attendez la fin du script. Vous pourrez choisir de vider automatiquement le dossier source à la fin.

Le script opère en 3 grandes étapes automatisées :

🧹
1. Nettoyage et Copie Nettoyage des métadonnées et copie des documents vers le répertoire fichiers_propres en respectant l’arborescence source. Les documents non pris en charge sont juste copiés en l’état.
🔄
2. Transfert USB Copie des données du répertoire fichiers_propres et du log (nettoyage_complet.log) sur la clé USB connectée dans un dossier nommé Nettoyage_heure_date-du-jour.
🗑️
3. Nettoyage système On vous demande si vous souhaitez supprimer définitivement les données du répertoire source a_nettoyer.