Ask me anything
Ithy Logo
Sign in to save

Création d'un Script de Rangement de Fichiers par Extension

Un guide pas à pas pour organiser vos fichiers avec un script simple.

script-ranger-fichiers-extension-i3sd1dl6

Points Clés

  • Identification par Extension : Le script se base sur l'extension de chaque fichier pour déterminer sa catégorie.
  • Organisation par Type : Les fichiers sont déplacés vers des sous-répertoires spécifiques (images, documents, videos) en fonction de leur extension.
  • Création Automatique de Dossiers : Le script inclut une vérification et la création automatique des répertoires cibles s'ils n'existent pas.

Ce guide détaillé vous accompagnera dans la création progressive d'un script simple mais efficace pour organiser vos fichiers en fonction de leur extension. Nous allons commencer par la gestion d'un seul fichier, puis étendre la fonctionnalité pour traiter plusieurs fichiers à la fois, et enfin, ajouter une étape essentielle de vérification et de création des dossiers de destination.

Comprendre les Extensions de Fichiers

Avant de plonger dans le script, il est important de comprendre ce qu'est une extension de fichier. L'extension est la partie du nom de fichier qui suit le dernier point. Elle indique généralement le type de contenu du fichier et le programme avec lequel il est censé être ouvert. Par exemple, dans rapport.pdf, .pdf est l'extension, indiquant qu'il s'agit d'un document PDF.

Les systèmes d'exploitation comme Windows et macOS utilisent les extensions pour associer les fichiers aux applications appropriées. Bien que l'on puisse changer l'extension d'un fichier, cela ne modifie pas son contenu ou son format réel. Il est donc crucial d'identifier correctement l'extension pour un classement précis.

Des outils comme TrID peuvent être utilisés pour identifier les types de fichiers en examinant leurs signatures binaires, ce qui est utile lorsque l'extension est manquante ou incorrecte.

Étape 1 : Script pour un Seul Argument

Nous allons commencer par créer un script simple qui prend un seul nom de fichier en argument et le déplace dans le répertoire approprié en fonction de son extension. Pour cela, nous utiliserons un langage de script, comme Bash ou Python, qui sont couramment utilisés pour les tâches d'automatisation de fichiers.

Approche avec un Script Bash

Voici comment vous pourriez écrire un script Bash pour gérer un seul fichier :

#!/bin/bash

# Vérifier si un argument a été passé
if [ $# -ne 1 ]; then
  echo "Usage: $0 <nom_du_fichier>"
  exit 1
fi

fichier="$1"
extension="${fichier##*.}" # Extraire l'extension du fichier

# Convertir l'extension en minuscules pour faciliter la comparaison
extension_lower=$(echo "$extension" | tr '[:upper:]' '[:lower:]')

case "$extension_lower" in
  "pdf")
    mkdir -p documents # Créer le répertoire si inexistant
    mv "$fichier" documents/
    echo "Le fichier '$fichier' a été déplacé dans le répertoire 'documents'."
    ;;
  "png"|"gif")
    mkdir -p images # Créer le répertoire si inexistant
    mv "$fichier" images/
    echo "Le fichier '$fichier' a été déplacé dans le répertoire 'images'."
    ;;
  "avi"|"mov")
    mkdir -p videos # Créer le répertoire si inexistant
    mv "$fichier" videos/
    echo "Le fichier '$fichier' a été déplacé dans le répertoire 'videos'."
    ;;
  *)
    echo "L'extension du fichier '$fichier' n'est pas reconnue. Le fichier n'a pas été déplacé."
    ;;
esac

Explication du Script Bash :

  • #!/bin/bash : Indique que le script doit être exécuté avec Bash.
  • if [ $# -ne 1 ]; then ... fi : Vérifie si exactement un argument a été fourni. Sinon, affiche un message d'utilisation et quitte.
  • fichier="$1" : Stocke le premier argument (le nom du fichier) dans la variable fichier.
  • extension="${fichier##*.}" : Utilise l'expansion de paramètres pour extraire la partie du nom de fichier après le dernier point, c'est-à-dire l'extension.
  • extension_lower=$(echo "$extension" | tr '[:upper:]' '[:lower:]') : Convertit l'extension en minuscules pour une comparaison insensible à la casse.
  • case "$extension_lower" in ... esac : Structure conditionnelle qui compare l'extension (en minuscules) à différentes valeurs.
  • "pdf") ... ;; : Si l'extension est "pdf", crée le répertoire "documents" s'il n'existe pas (mkdir -p) et déplace le fichier (mv).
  • "png"|"gif") ... ;; : Si l'extension est "png" ou "gif", crée le répertoire "images" s'il n'existe pas et déplace le fichier.
  • "avi"|"mov") ... ;; : Si l'extension est "avi" ou "mov", crée le répertoire "videos" s'il n'existe pas et déplace le fichier.
  • *) ... ;; : Pour toutes les autres extensions, affiche un message indiquant que l'extension n'est pas reconnue.

Approche avec un Script Python

Alternativement, vous pouvez utiliser Python pour accomplir la même tâche. Python est souvent préféré pour sa lisibilité et sa portabilité.

import sys
import os

# Vérifier si un argument a été passé
if len(sys.argv) != 2:
    print("Usage: python ranger.py <nom_du_fichier>")
    sys.exit(1)

fichier = sys.argv[1]
nom_fichier, extension = os.path.splitext(fichier)
extension_lower = extension[1:].lower() # Supprimer le point et convertir en minuscules

if extension_lower == "pdf":
    repertoire_cible = "documents"
elif extension_lower in ["png", "gif"]:
    repertoire_cible = "images"
elif extension_lower in ["avi", "mov"]:
    repertoire_cible = "videos"
else:
    print(f"L'extension du fichier '{fichier}' n'est pas reconnue. Le fichier n'a pas été déplacé.")
    sys.exit(0) # Sortie réussie même si le fichier n'est pas déplacé

# Créer le répertoire cible s'il n'existe pas
if not os.path.exists(repertoire_cible):
    os.makedirs(repertoire_cible)
    print(f"Le répertoire '{repertoire_cible}' a été créé.")

# Déplacer le fichier
try:
    os.rename(fichier, os.path.join(repertoire_cible, fichier))
    print(f"Le fichier '{fichier}' a été déplacé dans le répertoire '{repertoire_cible}'.")
except FileNotFoundError:
    print(f"Erreur : Le fichier '{fichier}' est introuvable.")
except Exception as e:
    print(f"Une erreur est survenue lors du déplacement du fichier : {e}")

Explication du Script Python :

  • import sys et import os : Importe les modules nécessaires pour accéder aux arguments de la ligne de commande et interagir avec le système de fichiers.
  • if len(sys.argv) != 2: ... sys.exit(1) : Vérifie si le nombre d'arguments est correct (le nom du script + un argument).
  • fichier = sys.argv[1] : Récupère le nom du fichier passé en argument.
  • nom_fichier, extension = os.path.splitext(fichier) : Sépare le nom du fichier de son extension.
  • extension_lower = extension[1:].lower() : Supprime le point de l'extension (avec [1:]) et la convertit en minuscules.
  • if/elif/else : Structure conditionnelle pour déterminer le répertoire cible en fonction de l'extension.
  • if not os.path.exists(repertoire_cible): os.makedirs(repertoire_cible) : Vérifie si le répertoire cible existe et le crée avec os.makedirs() s'il n'existe pas. os.makedirs() peut créer des répertoires intermédiaires si nécessaire.
  • os.rename(fichier, os.path.join(repertoire_cible, fichier)) : Déplace le fichier vers le répertoire cible. os.path.join() construit le chemin complet vers la destination du fichier.
  • try...except : Gère les erreurs potentielles, comme le fichier non trouvé.

Étape 2 : Gestion d'un Nombre Quelconque d'Arguments

Maintenant, modifions le script pour qu'il puisse accepter plusieurs noms de fichiers en arguments et les traiter un par un.

Modification du Script Bash

Dans le script Bash, nous pouvons utiliser une boucle pour parcourir tous les arguments passés.

#!/bin/bash

# Vérifier si au moins un argument a été passé
if [ $# -eq 0 ]; then
  echo "Usage: $0 <fichier1> [fichier2 ...]"
  exit 1
fi

# Parcourir tous les arguments
for fichier in "$@"; do
  if [ -f "$fichier" ]; then # Vérifier si l'argument est un fichier existant
    extension="${fichier##*.}"
    extension_lower=$(echo "$extension" | tr '[:upper:]' '[:lower:]')

    case "$extension_lower" in
      "pdf")
        mkdir -p documents
        mv "$fichier" documents/
        echo "Le fichier '$fichier' a été déplacé dans le répertoire 'documents'."
        ;;
      "png"|"gif")
        mkdir -p images
        mv "$fichier" images/
        echo "Le fichier '$fichier' a été déplacé dans le répertoire 'images'."
        ;;
      "avi"|"mov")
        mkdir -p videos
        mv "$fichier" videos/
        echo "Le fichier '$fichier' a été déplacé dans le répertoire 'videos'."
        ;;
      *)
        echo "L'extension du fichier '$fichier' n'est pas reconnue. Le fichier n'a pas été déplacé."
        ;;
    esac
  else
    echo "L'argument '$fichier' n'est pas un fichier valide ou n'existe pas. Il a été ignoré."
  fi
done

Explication de la Modification Bash :

  • if [ $# -eq 0 ]; then ... fi : Vérifie si aucun argument n'a été passé.
  • for fichier in "$@"; do ... done : Cette boucle itère sur tous les arguments passés au script (représentés par "$@"). Chaque argument est successivement stocké dans la variable fichier.
  • if [ -f "$fichier" ]; then ... fi : Ajoute une vérification pour s'assurer que l'argument actuel est bien un fichier existant avant de tenter de le traiter.

Modification du Script Python

En Python, nous pouvons également itérer sur les arguments de la ligne de commande en utilisant une tranche de sys.argv.

import sys
import os

# Vérifier si au moins un argument a été passé
if len(sys.argv) < 2:
    print("Usage: python ranger.py <fichier1> [fichier2 ...]")
    sys.exit(1)

# Parcourir tous les arguments (à partir du deuxième, le premier étant le nom du script)
for fichier in sys.argv[1:]:
    if os.path.isfile(fichier): # Vérifier si l'argument est un fichier existant
        nom_fichier, extension = os.path.splitext(fichier)
        extension_lower = extension[1:].lower()

        if extension_lower == "pdf":
            repertoire_cible = "documents"
        elif extension_lower in ["png", "gif"]:
            repertoire_cible = "images"
        elif extension_lower in ["avi", "mov"]:
            repertoire_cible = "videos"
        else:
            print(f"L'extension du fichier '{fichier}' n'est pas reconnue. Le fichier n'a pas été déplacé.")
            continue # Passer au prochain argument

        # Créer le répertoire cible s'il n'existe pas
        if not os.path.exists(repertoire_cible):
            os.makedirs(repertoire_cible)
            print(f"Le répertoire '{repertoire_cible}' a été créé.")

        # Déplacer le fichier
        try:
            os.rename(fichier, os.path.join(repertoire_cible, fichier))
            print(f"Le fichier '{fichier}' a été déplacé dans le répertoire '{repertoire_cible}'.")
        except Exception as e:
            print(f"Une erreur est survenue lors du déplacement du fichier '{fichier}': {e}")
    else:
        print(f"L'argument '{fichier}' n'est pas un fichier valide ou n'existe pas. Il a été ignoré.")

Explication de la Modification Python :

  • for fichier in sys.argv[1:]: ... : Itère sur les arguments à partir du deuxième élément de la liste sys.argv (le premier élément étant le nom du script lui-même).
  • if os.path.isfile(fichier): ... : Vérifie si l'argument actuel est un fichier existant en utilisant os.path.isfile().
  • continue : Si l'extension n'est pas reconnue, cette instruction permet de passer directement à l'itération suivante de la boucle, traitant ainsi le prochain fichier.

Étape 3 : Vérification et Création des Répertoires Cibles

L'étape la plus importante pour la robustesse de notre script est de s'assurer que les répertoires de destination (images, documents, videos) existent bien avant de tenter d'y déplacer des fichiers. Si un répertoire n'existe pas, le script doit le créer automatiquement.

Dans les scripts précédents (Bash et Python), nous avons déjà intégré cette vérification et création dans chaque branche du case ou if/elif. Cependant, pour une meilleure organisation et pour éviter la répétition de code, surtout si nous devions ajouter plus de types de fichiers, il est préférable de centraliser cette logique.

Amélioration du Script Bash

On peut ajouter une vérification et création des répertoires au début du script, ou avant la boucle de traitement des fichiers.

#!/bin/bash

# Vérifier si au moins un argument a été passé
if [ $# -eq 0 ]; then
  echo "Usage: $0 <fichier1> [fichier2 ...]"
  exit 1
fi

# Définir les répertoires cibles et créer s'ils n'existent pas
declare -A repertoires_cibles
repertoires_cibles=( ["pdf"]="documents" ["png"]="images" ["gif"]="images" ["avi"]="videos" ["mov"]="videos" )

for repertoire in "${repertoires_cibles[@]}"; do
  if [ ! -d "$repertoire" ]; then
    mkdir -p "$repertoire"
    echo "Le répertoire '$repertoire' a été créé."
  fi
done

# Parcourir tous les arguments
for fichier in "$@"; do
  if [ -f "$fichier" ]; then
    extension="${fichier##*.}"
    extension_lower=$(echo "$extension" | tr '[:upper:]' '[:lower:]')

    if [[ -v repertoires_cibles[$extension_lower] ]]; then # Vérifier si l'extension est dans notre liste
      repertoire_cible="${repertoires_cibles[$extension_lower]}"
      mv "$fichier" "$repertoire_cible/"
      echo "Le fichier '$fichier' a été déplacé dans le répertoire '$repertoire_cible'."
    else
      echo "L'extension du fichier '$fichier' n'est pas reconnue. Le fichier n'a pas été déplacé."
    fi
  else
    echo "L'argument '$fichier' n'est pas un fichier valide ou n'existe pas. Il a été ignoré."
  fi
done

Explication de l'Amélioration Bash :

  • declare -A repertoires_cibles : Déclare un tableau associatif pour mapper les extensions aux noms de répertoires.
  • repertoires_cibles=( ["pdf"]="documents" ... ) : Initialise le tableau associatif.
  • for repertoire in "${repertoires_cibles[@]}"; do ... done : Boucle sur les valeurs du tableau associatif (les noms des répertoires cibles).
  • if [ ! -d "$repertoire" ]; then ... fi : Vérifie si le nom actuel est un répertoire existant (-d). Si ce n'est PAS un répertoire (! -d), il est créé.
  • if [[ -v repertoires_cibles[$extension_lower] ]]; then ... fi : Dans la boucle de traitement des fichiers, cette condition vérifie si l'extension (en minuscules) existe comme clé dans le tableau associatif.
  • repertoire_cible="${repertoires_cibles[$extension_lower]}" : Récupère le nom du répertoire cible correspondant à l'extension.

Amélioration du Script Python

En Python, nous pouvons utiliser un dictionnaire pour stocker le mappage des extensions aux répertoires et itérer sur les répertoires nécessaires.

import sys
import os

# Vérifier si au moins un argument a été passé
if len(sys.argv) < 2:
    print("Usage: python ranger.py <fichier1> [fichier2 ...]")
    sys.exit(1)

# Définir le mappage des extensions aux répertoires cibles
repertoires_par_extension = {
    "pdf": "documents",
    "png": "images",
    "gif": "images",
    "avi": "videos",
    "mov": "videos"
}

# Récupérer la liste unique des répertoires cibles nécessaires
repertoires_uniques = set(repertoires_par_extension.values())

# Créer les répertoires cibles s'ils n'existent pas
for repertoire in repertoires_uniques:
    if not os.path.exists(repertoire):
        os.makedirs(repertoire)
        print(f"Le répertoire '{repertoire}' a été créé.")

# Parcourir tous les arguments
for fichier in sys.argv[1:]:
    if os.path.isfile(fichier):
        nom_fichier, extension = os.path.splitext(fichier)
        extension_lower = extension[1:].lower()

        repertoire_cible = repertoires_par_extension.get(extension_lower)

        if repertoire_cible: # Vérifier si l'extension est reconnue (si repertoire_cible n'est pas None)
            try:
                os.rename(fichier, os.path.join(repertoire_cible, fichier))
                print(f"Le fichier '{fichier}' a été déplacé dans le répertoire '{repertoire_cible}'.")
            except Exception as e:
                print(f"Une erreur est survenue lors du déplacement du fichier '{fichier}': {e}")
        else:
            print(f"L'extension du fichier '{fichier}' n'est pas reconnue. Le fichier n'a pas été déplacé.")
    else:
        print(f"L'argument '{fichier}' n'est pas un fichier valide ou n'existe pas. Il a été ignoré.")

Explication de l'Amélioration Python :

  • repertoires_par_extension = { ... } : Crée un dictionnaire où les clés sont les extensions (en minuscules) et les valeurs sont les noms des répertoires cibles.
  • repertoires_uniques = set(repertoires_par_extension.values()) : Crée un ensemble (qui contient des éléments uniques) des noms de répertoires cibles à partir des valeurs du dictionnaire. Cela garantit que chaque répertoire n'est vérifié et potentiellement créé qu'une seule fois.
  • for repertoire in repertoires_uniques: ... : Boucle sur les noms de répertoires uniques et les crée s'ils n'existent pas.
  • repertoire_cible = repertoires_par_extension.get(extension_lower) : Utilise la méthode .get() du dictionnaire pour récupérer le répertoire cible associé à l'extension. Si l'extension n'est pas une clé dans le dictionnaire, .get() renvoie None par défaut.
  • if repertoire_cible: ... : Cette condition est vraie si repertoire_cible n'est pas None, c'est-à-dire si l'extension a été trouvée dans le dictionnaire.

Visualisation du Processus

Voici une image simple pour illustrer le concept de l'organisation de fichiers par type dans différents dossiers :

Organisation de fichiers par catégorie.

Illustration de dossiers organisés par type de fichiers

Cette image représente visuellement l'idée de prendre divers documents et de les classer dans des dossiers étiquetés, similaire à ce que fait notre script avec les extensions de fichiers.


Résumé des Commandes Clés

Voici un tableau récapitulatif des commandes utilisées pour les opérations de fichiers dans les scripts Bash et Python :

Opération Bash Python (module os)
Extraire l'extension "${fichier##*.}" os.path.splitext(fichier)[1]
Convertir en minuscules $(echo "$extension" | tr '[:upper:]' '[:lower:]') extension.lower() ou extension[1:].lower()
Créer un répertoire (avec parents) mkdir -p <nom_repertoire> os.makedirs(<nom_repertoire>)
Vérifier si un chemin existe [ -e "<chemin>" ] os.path.exists(<chemin>)
Vérifier si un chemin est un fichier [ -f "<chemin>" ] os.path.isfile(<chemin>)
Vérifier si un chemin est un répertoire [ -d "<chemin>" ] os.path.isdir(<chemin>)
Déplacer un fichier mv <source> <destination> os.rename(<source>, <destination>)
Construire un chemin "<repertoire>/<fichier>" (peut nécessiter attention aux slashs) os.path.join(<repertoire>, <fichier>)

Approches Alternatives pour l'Organisation de Fichiers

En dehors des scripts Bash et Python, il existe d'autres méthodes et outils pour organiser des fichiers en fonction de leur extension :

  • Commandes Système : Des commandes comme move sur Windows ou mv (avec find et exec) sur les systèmes Unix/Linux peuvent être utilisées directement dans le terminal pour déplacer des fichiers. Par exemple, pour déplacer tous les fichiers .txt dans un répertoire 'text' sur Linux : find . -name "*.txt" -exec mv {} text/ \;
  • Outils Tiers : Il existe des applications dédiées comme DropIt ou Download Mover pour Windows qui permettent de créer des règles pour l'organisation automatique de fichiers basées sur des extensions ou d'autres critères.
  • Fonctionnalités des Explorateurs de Fichiers : Bien que limités pour l'automatisation, les explorateurs de fichiers (comme l'Explorateur Windows ou Finder sur macOS) permettent de trier les fichiers par type ou extension, facilitant ainsi le déplacement manuel.

Ces méthodes peuvent être utiles en fonction de la complexité de la tâche et du niveau d'automatisation souhaité.


FAQ

Que se passe-t-il si un fichier portant le même nom existe déjà dans le répertoire de destination ?

Dans les scripts présentés, la commande mv (Bash) et la fonction os.rename() (Python) par défaut écraseront le fichier existant dans le répertoire de destination. Pour éviter cela, vous pouvez ajouter une logique de vérification avant le déplacement, par exemple en renommant le nouveau fichier avec un horodatage.

Le script peut-il organiser des fichiers dans des sous-répertoires imbriqués ?

Les scripts tels que présentés traitent uniquement les fichiers passés en arguments. Pour organiser des fichiers dans des sous-répertoires, il faudrait ajouter une logique pour parcourir récursivement les dossiers à l'aide de commandes comme find (Bash) ou des fonctions comme os.walk() (Python).

Comment puis-je rendre le script exécutable plus facilement ?

Pour un script Bash, assurez-vous qu'il a les permissions d'exécution (chmod +x ranger.sh) et placez-le dans un répertoire inclus dans votre variable d'environnement PATH. Pour un script Python, vous pouvez l'exécuter en appelant l'interpréteur Python (python ranger.py ...). Il est également possible de créer des exécutables autonomes à l'aide d'outils comme PyInstaller.

Puis-je ajouter de nouvelles extensions et répertoires au script ?

Oui, vous pouvez facilement étendre le script en ajoutant de nouvelles entrées dans la structure conditionnelle (case en Bash, if/elif en Python) ou en ajoutant des paires clé-valeur dans le dictionnaire/tableau associatif des mappages d'extensions et de répertoires.


Références

learn.microsoft.com
déplacer | Microsoft Learn

Last updated May 9, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI