Script pour renommer plusieurs répertoires ?

Bonjour à tous,

Mon pb n’est pas spécifiquement lié à Debian mais comme il y a pas mal de personnes balaises en script qui parcourent ce forum…
J’ai, dans un répertoire X, une quantité énorme de répertoires (nommés sous la forme “ABC - XYZ” et ne contenant que des fichiers) à renommer en “Sentence Case”… (càd avec une majuscule à la première lettre de chaque mot)

J’ai cherché ici et aussi à l’aide de mon ami Google des logiciels ou moyens permettant cela…
J’ai notamment trouvé “pyRenamer” qui semble très bien… mais il ne permet apparemment de renommer en masse que des fichiers ! (et non des répertoires)
J’ai aussi trouvé quelques scripts, comme celui-ci par exemple :

sauf que :

  • comme il n’est pas tout à fait adapté à mon cas, (c’est pour plusieurs niveaux de sous répertoires à renommer d’après la personne qui l’a écrit)
  • malheureusement dans ce script il n’ y a que la partie “sed” qui est (succinctement) expliqué,
  • je suis une grosse brêle dans le domaine des scripts, (notamment :smt003 )

:arrow_right: du coup je ne sais pas comment, ni quoi, modifier pour réaliser ce que je voudrais !!!

Quelqu’un pourrait-il svp :
1°) m’aider à faire ce script car j’en ai réellement besoin (et un peu rapidement en plus :blush: )
2°) me conseiller une ou des lecture(s) saine(s) (livres/Internet) sur les scripts en général car j’aimerai comprendre ce que je fais (ou ferais en l’occurrence…)

Merci d’avance pour votre aide !
Eric

Je peux déjà te conseiller une bonne lecture, http://abs.traduc.org/, il existe aussi en paquet debian
mais que en anglais si je ne me trompe pas.

Sinon, si tu es vraiment pressé et que tu ne trouves pas un moyen de faire le script,
tu peux installer Thunar, l’ouvrir dans le répertoire qui contient ceux que tu veux renommer,
faire ctrl-a, F2, Chercher et remplacer >> Majuscule / Minuscule, Convertir en : >> 1ère LettreEnMaj.
et tu est rendu.
Désolé, c’est pas un script, mais bon ça te dépannera si tu trouve pas d’autres solutions.

Merci déjà eol pour ce lien !

Ca à l’air d’être pas mal du tout pour commencer…
:arrow_right: comme dirait l’autre : YAPUKA !!!

Par contre, juste pour info, il y a des trucs bizarres dans ce document : (avec Acrobat Reader, KPDF ou KGhostView)

  • page 8/716 : Java, Perl437 ou Python. […] sous le nom de commandes intégrées159 […] dans un script shell365
  • page 9/716 : fonctionnalités de ksh88 […] mise à jour ksh93
  • page 13/716 : code répétitifs par des fonctions352 […] la lecture de stdin638 […] peut commencer avec une ligne sha-bang, #!/bin/env bash309

etc, etc…

Heu… si jamais quelqu’un à la solution à mon pb… parce que d’ici là que j’ingurgite les… 716 pages…

:unamused:

Arf !
eol, j’avais pas vu ta deuxième réponse !

Merci pour l’info : effectivement, je vais commencer par Thunar…

:arrow_right: Mais par contre ton guide m’intéresse vraiment : c’est super sympa !!!

Je viens de faire l’essai avec Thunar : ça fonctionne !!!

:arrow_right: Génial, merci à toi eol !! (mais si quelqu’un à un script, histoire de voir comme on fait…)

Pour info, j’ai découvert un petit bug d’affichage dans Thunar : certains nouveaux noms des répertoires que l’on veut mettre en “1ère LettreEnMaj” ne s’affichent pas, alors que la conversion se passe correctement !! (RAS en conversion “minuscule” ou “MAJUSCULE”)

Sinon, petite question subsidiaire : je viens juste de remarquer que dans mon répertoire X (celui qui contennait tous les répertoires “ABC - XYZ” à renommer et qui est en ext3) j’ai des répertoires de 4Ko et d’autre de 12Ko !

PC01:/home/eric/ziks$ ls -a -l |grep de drwxr-xr-x 2 eric eric 12288 mai 25 18:51 Def Leppard - Euphoria drwxr-xr-x 2 eric eric 4096 mai 25 18:33 Def Leppard - Hysteria

Why this difference ?

Pour les 4 et 12ko, je crois que c’est lié au contenu de tes répertoires, pour les trucs bizarre dans abs, moi je ne les ai pas mais j’utilise pas la version pdf,
je préfère naviguer dans le multifichiers html.

Sinon en mode clicodrome, je trouve easytag vraiment pas mal pour ranger de la musique. Il modifie aussi bien les noms des fichiers que des dossiers, à la demande.

BBK

Sinon, toujours placé dans le même répertoire tu peux essayer cette commande :$ rename 's/^\w/\U$&/g' *
Je te remercie d’avoir posé ta question, tu m’as fait apprendre quelque chose d’intéressant aujourd’hui. :wink:

[quote]Pour les 4 et 12ko, je crois que c’est lié au contenu de tes répertoires[/quote] Ben dans ce cas, je ne vois pas pourquoi il fait une différence alors : j’ai plusieurs répertoires ne contenant que des .mp3 (au hasard :wink:) ou que des .jpg mais parfois ils s’affichent avec une taille de 4 Ko et parfois 12 Ko !!
Ca m’intrigue !!!

[quote]pour les trucs bizarre dans abs, moi je ne les ai pas mais j’utilise pas la version pdf[/quote]Exact : on dirait que c’est leur méthode pour passer du xml au pdf qui foire…

[quote]$ rename ‘s/^\w/\U$&/g’ *[/quote]Attention hein : restons polis ! :smt003

Non, sérieusement, j’ai cherché un peu ce que voulait dire ce “charabia” mais j’ai pas tout pigé…
Vu le man de rename, ce qui suis est exprimé en Perl, c’est ça ?
Voilà ensuite ce que je crois avoir déduis de ton expression :
s = on cherche…
/ = “vrai” si la cible commence par…
^ = complément
\W = caractère différent d’une lettre (séparateur, signe de ponctuation, etc)

et c’est à partir de là que j’ai l’impression d’entrer dans la 4ème dimension !!!
Je ne pige pas ce que veut dire la suite, et surtout je n’arrive pas à remettre tout dans l’ordre et à “l’exprimer en français” correctement.

(Et juste pour info, ta formule fonctionne mais que pour le premier terme du nom du répertoire…)

[quote]Je te remercie d’avoir posé ta question…[/quote]Heu… là tu inverses les rôles : c’est plutôt à moi de te remercier : c’est quand même grace à toi que je n’ai pas eu des tonnes de répertoires à renommer à la mano !!! :smt006

:arrow_right: Je marque ce post comme résolu (grâce à toi) mais on peut continuer de parler de ton rename ‘@$~£%^&#!?µ*’ :smt003 :smt003 :smt003

Bonjour,
Pour les 4 et 12 ko, j’aurais dû dire que c’est lié à la quantité de contenu de ton répertoire.

Bon alors, sans grande garantie d’exactitude :
^\w : premier caractère (si appartenant à a-z A-Z 0-9 et _ sinon ^\W)
\U : Uppercase (majuscule)
g : applique les modifications à toute les expressions régulières et pas seulement à la première

  • : pour tous les fichiers ou répertoires non cachés
    Les \ sont là pour que w et U ne soient pas interprétés comme de simples lettres, mais avec leur signification particulière.

Oui, je t’avais lu un peu vite et je croyais que c’étais ça que tu voulais.

Pour avoir ce que tu veux, il va falloir modifier la partie située entre le s et le g,
si tu trouve que $ man sed ne fournit pas assez d’infos, regarde$ info sed

Bonsoir,

Si tu refais une deuxième passe avec : $ rename 's/-\ \w/\U$&/g' * les mots qui se trouvent après les "- "
dans tes noms de répertoires auront eux aussi leur première lettre en majuscule.
Au lieu de ^\w pour signifier le premier caractère de l’expression, on utilise -\ \w pour signifier le premier caractère
après le "- ".

Je connais pas perl, mais puisqu’on était dedans, je me suis un peu renseigné.
Tu peux regarder ici pour des bases en perl.

Salut eol,

Bon j’ai essayé de potasser un peu tout ça… (merci encore pour ton aide et tes liens)
D’ailleurs, si ça t’intéresse, j’ai trouvé ça aussi concernant Sed et qui m’a bien aidé : Astuces Sed - Problèmes, pannes et solutions

Voilà ce que je crois avoir compris pour ton premier exemple : (remplacement de la 1ère lettre du 1er mot par sa majuscule)
N’hésites pas à me reprendre si je raconte des c…s grosses comme moi !!! :smt003

:arrow_right: s/x/y/g c’est à dire “renomme en substituant x par y globalement” avec x (expression régulière) = ^\W et y (autre expression régulière) = \U$& et g (drapeau) qui ici ne sert à rien j’ai l’impression… (pour cet exemple précis, j’entends)

Ce qui se traduirait en bon français par : “Si le début de ligne commence par un caractère compris entre A (majuscule ou minuscule) et Z (majuscule ou minuscule) ou encore un chiffre compris entre 0 et 9, substitue le par lui-même mais en majuscule (conversion)”

Par contre, et c’est là que j’ai besoin de ton aide, je n’arrive toujours pas à comprendre ce que veux dire $& !!!
$ (méta-caractère) = recherche la fin de la ligne ou du mot,
& (méta-caractère aussi) = réutilise le motif de recherche dans le motif de remplacement,
Les deux, chacun de leur coté, j’ai bien compris leur fonction… mais l’association des deux dans ton expression… là j’avoue : no comprendo !!!
Pourtant, en les supprimant, je constate bien le résultat donné… mais malgré tout, je ne comprends pas la relation de cause à effet…

P.S. : bien compris aussi la modif dans ton deuxième exemple (qui fonctionne très bien en deuxième passe, merci !) mais je bloque toujours sur le $&

:arrow_right: Bonnet d’âne ???

J’avoue que je suis plus empirique qu’intellectuel.
Tu as raison de souligner que le g n’était pas indispensable.
Tu as remarqué que quand on ajoute pas $&, au lieu de remplacer le caractère, ça le supprime.
J’ai pas d’explication rationnelle pour ça, mais en même temps je connais pas perl.

[quote=“eol”]Tu as remarqué que quand on ajoute pas $&, au lieu de remplacer le caractère, ça le supprime.
J’ai pas d’explication rationnelle pour ça, mais en même temps je connais pas perl.[/quote]
Ben c’est logique pour le “&”, puisqu’il faut redonner le motif. Sinon, effectivement ça supprime le caractère (ça le remplace par « rien », qui en majuscule donne… rien :smt001 )

Le seul truc que je pige pas, moi, c’est le «$ » ! Je suppose que quand il est dans la deuxième partie de l’expression, il signifie autre chose que la fin de la ligne.

Peut-être qu’il désigne la variable à remplacer?
Par exemple, si tu essaies avec rename 's/^\w/\U&/' * au lieu de rename 's/^\w/\U$&/' *, ça va te remplacer toutes les premières lettres par &.

Bien vu kna pour le & car maintenant j’ai pigé : merci à toi !!!

Reste plus que le $… et je me demande s’il n’est pas lié au rename car quand on fait un man rename, on peut lire :

[quote]For example, to rename all files matching “*.bak” to strip the extension, you might say

           rename 's/\.bak$//' *.bak

[/quote]
Un peu comme si le $ indiquait au rename :

  • si à “gauche” : la fin du pattern (nécessaire pour le “*.bak” mais pas nécessaire pour mon rename “^\w” puisque on demande juste le 1er caractère)
  • si à “droite” : la fin de l’action (à faire si le pattern est vrai) c’est à dire “” (rien/supprimer) pour l’exemple dans le man et juste convertir en majuscule le 1er caractère (et comme dit kna redonner ensuite ce caractère par le &) dans mon rename…

J’en ai “déduis” ça en voyant l’exemple expliqué ici
C’est scabreux mon histoire ? :unamused:

[quote=“eol”]Par exemple, si tu essaies avec

rename 's/^\w/\U&/' * au lieu de rename 's/^\w/\U$&/' * , ça va te remplacer toutes les premières lettres par &.
[/quote]
Effectivement, donc « $& » en perl (rename), c’est simplement l’équivalent de « & » tout court en « regexp » (sed) :

[quote=“man sed”]s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.
[/quote]

Le « & » tout court en perl donne simplement le caractère « & ».

Moi qui ai tendance à utiliser rename comme si j’utilisais sed, je devrais faire attention à ce genre de trucs. Bon, de toute façon, la meilleure règle à suivre est de copier quelques fichiers pour tester la commande avant de l’appliquer sur une centaine de fichiers…

EDIT : D’ailleurs les \1, \2, etc… ne sont pas interprétés de la même façon. En bon idiot utilisateur de sed, j’aurais fait (pour faire la même chose) :

(avec sed, \1 « à droite » rappelle la première expression entre ( et ) « à gauche »)
Or il faut faire :

Avec rename, il ne faut pas échapper les parenthèses et utiliser $1 au lieu de \1.