skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

lundi 28 décembre 2009

Fichier batch pour renommer les fichiers en lot

Publié par Infinite Loop, à 11 h 23 3 commentaires

Je possède une collection de fichiers PDF que j'accumule depuis des années et j'avais initialement commencé à préfixer leurs noms avec le nom de l'éditeur pour avoir une certaine forme de classement (par exemple : O'Reilly-PHP Cookbook.pdf). En ayant réuni des milliers de pdf en 5 ou 6 ans, je me suis rendu compte que ça aurait été plus approprié de les classer comme mes mp3, en créant un répertoire par éditeur et en les regroupant à l'intérieur. Classés ainsi, il n'était plus nécessaire de voir apparaître l'éditeur dans le nom des fichiers.

Comment faire un ménage rapide sur un volume élevé de fichiers ? Je sais qu'il existe des logiciels commerciaux et des sharewares qui peuvent faciliter le travail mais je n'ai pas le goût de polluer mon poste pour une simple opération. De plus, étant un programmeur professionnel, pourquoi est-ce que je me laisserais tenter par la facilité alors que je peux moi-même écrire un fichier batch tout simple ? Une bonne opportunité pour programmer quelques lignes et me sauver beaucoup de temps sur une opération manuelle peu stimulante. De plus, ça me permet d'apprendre et de réviser des concepts.

Voici le script que j'ai écrit pour répondre aux appels similaires à celui-ci (avec 3 arguments) :

script.bat source mot_recherché remplacer_par

> script.bat "C:\Documents and Settings\Code18\PDF\" O'Reilly-

Le dernier argument est laissé vide car je veux le remplacer par une chaîne vide (autrement dit, juste retirer le mot clé recherché).

Le contenu de script.bat :

@echo off
rem http://code18.blogspot.com

set v_find=%2
set v_replace=%3

for /r %1 %%i in (*.pdf) do (
set v_path="%%~dpi"
set v_filename="%%~nxi"
call :rename
)
goto :eof

:rename
CALL set v_newfilename=%%v_filename:%v_find%=%v_replace%%%
ren %v_path%\%v_filename% %v_newfilename%
Mis à part les lignes insérées pour la lisibilité, le script compte moins de 15 lignes de code (moins de 1 Kb!) et s'exécute sur la totalité des fichiers en à peine quelques secondes.

Au début, je récupère les paramètres de la commande indiquant quoi rechercher (v_find) et par quoi le remplacer (v_replace) pour les conserver dans des variables (set). J'effectue une boucle récursive dans le répertoire racine (%1) et sous-répertoires pour ne pas avoir à tenir compte de leur emplacement dans l'arborescence et j'applique un filtre pour ne rechercher que les fichiers pdf.

Pour chaque fichier, j'extrais le chemin incluant de drive avec le flag "d". Autrement, lorsqu'il tentera de renommer le fichier, il risque de se plaindre que "The system cannot find the path specified". Je récupère aussi le nom du fichier avec son extension (%%~nxi). Ceci me permettra de procéder au remplacement uniquement sur le nom du fichier et non pas sur le chemin s'il s'avérait que le terme recherché se trouve aussi dans le path.

J'effectue un appel à une pseudo-fonction à l'extérieur de la boucle pour contourner le problème d'assignation aux variables que le script ne semble pas reconnaître correctement au moment du remplacement (dans :rename). Dans le bloc de code :rename, je crée une nouvelle variable qui contient le nouveau nom de fichier que j'obtiens par le remplacement avec la syntaxe %v_filename:find=replace% sur la variable %v_filename%. Comme j'utilise d'autres variables pour savoir quoi chercher et quoi remplacer, j'ajoute les % aux bons endroits. Je crois que si j'avais appellé cmd.exe avec le flag /v, j'aurais pu substituer les variables %var% par !var! pour une meilleure lisibilité dans l'imbrication. Enfin, je renomme le fichier avec ren.

Vous voyez un peu l'idée. Tout comme moi, vous pouvez modifier le script pour le réutiliser dans d'autres contextes, par exemple avec des mp3 pour retirer un préfixe (souvent le nom de l'artiste), retirer le préfixe automatique des photos provenant d'une caméra numérique (DSCFxxxx), etc. Une seule chose : faites attention aux délimiteurs avec des espaces dans les remplacements, je ne me suis pas encore penché sur le problème (ex: O'Reilly-Nom_du_livre versus O'Reilly - Nom_du_livre).

Faites en bon usage et n'hésitez pas à l'adapter à vos besoins.


Tags: Programmation

3 réponses à "Fichier batch pour renommer les fichiers en lot"

  1. Anonyme a dit...
    3 juin 2010 à 06 h 24

    J'ai pu renommer 4309 fichiers d'un seul coup avec ton script. Merci

    Jema a dit...
    15 août 2014 à 12 h 50

    Simple et efficace et donc facile à prendre pour base pour faire des modifications. Merci beaucoup!

    Unknown a dit...
    19 octobre 2014 à 19 h 15

    Bonjour,

    Merci pour ce petit bijou qui fonctionne également sur une partie du nom.
    J'ai ainsi pu retirer rapidement le SUFFixe de mes PDF.

    xxxxxyyy.pdf en xxxxx.pdf
    Hassen de Tunis


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (55)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ▼  2009 (429)
      • ▼  décembre 2009 (32)
        • Transférer de serveur une BD PostgreSQL
        • Manipuler des fichiers PDF gratuitement
        • Calendrier Linux en septembre 1752
        • Fichier batch pour renommer les fichiers en lot
        • Palindrome mathématique
        • Comment fonctionne le modulo ?
        • Citation no. 62 sur les artistes
        • Film Pirates of Silicon Valley
        • Une surprise pour Noël
        • The Long Tail par Chris Anderson
        • L'informatique et King Kong Bundy
        • Origine du nom des notes de musique
        • Ordre de recherche dans les schémas PostgreSQL
        • Ce que veut dire Wiki
        • Citation no. 61 à propos de PHP et Perl
        • Fusionner des structures JSON avec jQuery
        • Game Boy sur Psycho-acoustic
        • Clone de la Nintendo Wii
        • Exclure les répertoires .svn de grep
        • Tag de version avec TortoiseSVN
        • Compte à rebours 2010 de Google
        • État de santé - repos forcé à mes doigts
        • Citation no. 60 sur la complexité
        • jPod de Douglas Coupland
        • Simuler unnest() avant Postgres 8.4
        • Démo d'injection SQL sur MySQL
        • Jeu caché dans Gnome (GEGL)
        • Citation no. 59 sur le café
        • Le plus beau gars du Québec
        • Thème Windows XP sur Ubuntu : ça marche!
        • Invitation à un cocktail de Microsoft
        • Défilement sur Google Maps
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (36)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft