Créer des dossiers en fonction de fichiers présents dans un dossier, et déplacer les fichiers dans les dossiers

Bonjour à tous,

Je souhaite faire un dérivé du sujet déjà évoqué ici (http://www.clubic.com/forum/programmation/comment-creer-des-dossiers-automatiquement-en-fonction-des-fichiers-presents-id634904-page1.html), et qui fonctionne parfaitement.
Mais voilà, je ne connais pas assez le language de programmation ou ses subtilités, et n’arrive pas à modifier le code pour pouvoir l’appliquer à mon besoin (aussi simple soit-il).

DEFINITION DU BESOIN
Je travaille avec des fichiers vidéos, qui ont été ré-encodés selon différentes specs, et pour lesquels j’ai généré un certain nombre de vignettes JPG de manière automatique.
J’ai besoin de :

  • créer automatiquement des dossiers en utilisant la “racine” de nom de fichier
  • déplacer dans chacun des dossiers créés tous les fichiers créés à partir de mon fichier source
    Je travaille aujourd’hui sur des centaines de fichiers disposés à la racine d’un dossier, mais schématiserai mon besoin ci-dessous sur 18 éléments.

ex : Pour 2 fichiers vidéo source réencodés (que nous appellerons “source.avi” et “bidule.mkv”) je me retrouve avec 18 fichiers à classer :
source.avi.0000.jpg
source.avi.0001.jpg
source.avi.0002.jpg
source.avi.0003.jpg
source.avi.0004.jpg
source.avi.0005.jpg
source_3GP_176x144.3gp
source_MP4_320x240.mp4
source_MP4_640x480.mp4
bidule.mkv.0000.jpg
bidule.mkv.0001.jpg
bidule.mkv.0002.jpg
bidule.mkv.0003.jpg
bidule.mkv.0004.jpg
bidule.mkv.0005.jpg
bidule_3GP_176x144.3gp
bidule_MP4_320x240.mp4
bidule_MP4_640x480.mp4

=> J’ai besoin de :

  • la création d’un dossier “source”
  • déplacer tous les fichiers “source*.*” dans le dossier “source”
  • la création d’un dossier “bidule”
  • déplacer tous les fichiers “bidule*.*” dans le dossier “bidule”

Voilà… si vous avez la possibilité de m’éclairer, je suis preneur de toute aide et/ou suggestion.
J’en profiterai pour découvrir et comprendre les subtilités syntaxiques d’un monde qui m’est complètement inconnu à ce jour (la programmation).
Je vous remercie par avance pour votre aide, votre matière grise et votre temps!:yeux4:
T.
Edité le 04/02/2013 à 12:00

Là tu fais référence à une solution qui commence à dater.
De plus, travailler avec des noms partiels de fichier (tes racines) n’est pas évident avec ce genre de langage.
Je suppose que tu est en W7 ?
Alors tu as powershell dans ta machine et ce sera une solution beaucoup plus pratique pour toi.

Hello gcc,
En effet j’ai accès à Powershell, mais comme indiqué plus haut, le language de programmation n’est pas mon métier d’origine.
J’essaie tant bien que mal de trouver une solution à mon problème qui m’éviterait de tout faire manuellement.
Le coté “Powershell” est sûrement plus adapté, mais le coté “code pur et dur” m’effraie un peu, et je ne voudrais pas planter mon système complet suite à une mauvaise commande.
Je vais tout de même chercher un tuto d’initiation à Powershell, je croise les doigts.
Merci en tout cas pour ton aide!
T.

Houlaaaa… en effet, cela dépasse de loin mes compétences en compréhension et mise en oeuvre.
Je suis à l’écoute de toute suggestion et/ou aide opportune! :yeux1:
Merci d’avance!

Ca fait des années que je n’ai pas touché à powershell, c’était du temps où il n’était pas encore dans le package standard de windows, et en plus c’était de l’exercice imposé pour modifier de l’existant.
De mémoire, ce n’est pas trop compliqué à utiliser.
Je veux bien regarder ton truc d’un peu plus près si tu peux attendre la fin de la semaine, mais ne t’attends pas à du clé en main, il faudra sans doute que tu mettes quand même un peu la main à la pâte.

Un petit peu plus compliqué qu’à l’habitude à cause de ta notion de racine qui s’arrête au premier point, et de la non homogénéité des noms (les _ à la place des .) mais ça reste faisable :


#Boucle sur le dossier concerné
Get-ChildItem | Foreach {
  $Base = $_.BaseName
  $i = $Base.IndexOf('_')
  if ($i -eq -1)  {
    $i = $Base.IndexOf('.')
  }
  if ($i -eq -1) {
    return
  }           

 #traitement proprement dit
 $Racine = $Base.Substring(0, $i)
 #creation repertoire si besoin
 if ((Test-Path $Racine) -eq 0) {
   New-Item -Name $Racine  -ItemType directory
 } 

 #deplacement fichier
 Move-Item -path $_.name -destination $Racine
 
}