# Case De Titre spécifique avec Automator



## Youg009 (27 Mars 2018)

Bonjour à tous, 

Savez vous s'il est possible avec Automator de renommer des fichiers avec une *Case De Titre* mais sans impacter les mots en majuscules.

Exemple : 
 - *Nom source* : 
   mon titre de MUSIQUE.mp3
 - *Nom obtenu avec Case De Titre* : 
   Mon Titre De Musique.mp3
 - *Nom souhaité* : 
   Mon Titre De MUSIQUE.mp3

Si jamais avec Automator ce n'est pas possible et que vous connaissez une alternative, je suis preneur.

Merci d'avance.


----------



## byte_order (27 Mars 2018)

Appeler un script avec le nom du fichier en entree de sed ?


```
echo "mon titre de MUSIQUE.mp3" | sed 's/^./\U&/g; s/ ./\U&/g'
```

Ce qui retourne *Mon Titre De MUSIQUE.mp3
*
_EDIT: explication de la magie SED:
s/^./\U&/g   > chercher s/ en début de ligne un caractère ^.
                     le remplacer / par sa version majuscule \U&  
                     / sur toutes les lignes g
s/ ./\U&/g'   > meme chose, mais en cherchant le premier caractère après un espace_


----------



## zeltron54 (27 Mars 2018)

Bonjour,

@ byte_order
Je connais très mal les commandes shell, mais la tienne ne fonctionne pas, elle renvoie: UmonU titreU deU MUSIQUE.mp3
et je n'ai pas les connaissances nécessaires pour la modifier..

@ Youg009
Avec automator seul je ne pense pas que tu puisses le faire, il te faudra appeler un script.

Je te joins ci-dessous un script applescript qui fait le job.
La ligne :

set lesChar to {" ", "(", ".", "_", "-"} -- liste des caractères aprés lesquels on met une majuscule

Est à modifier à ta convenance, elle liste les caractères derrières lesquels il faut mettre une Majuscule j' y est mis: espace , point , parenthèse , underscore , tiret .


```
-- Renomme tous les fichiers d'un dossier y compris dans les sous dossiers
-- Avec majuscule en debut de mot laisse mot en majuscule si existe
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à renommer"
    my inspecter(chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set extens to document file nom in un_dossier --recupere l extension du fichier
                set lextension to name extension of extens
                set texte to nom
                set leNbchar to count of every character of texte
                set lePremier to 0
                set ledebut to 0
               
                set lesChar to {" ", "(", ".", "_", "-"} -- liste des caractères aprés lesquels on met une majuscule
               
                repeat with i from 1 to leNbchar
                    set leChar to text from i to i of texte
                    log leChar
                    set lePremier to lePremier + 1
                    set ledebut to ledebut + 1
                    if leChar is in lesChar then
                        set lePremier to 0
                    end if
                    if lePremier = 1 then
                        set leChar to text from i to i of texte
                        set leNum to ASCII number of leChar
                        if leNum > 96 and leNum < 123 then
                            set leNum to leNum - 32
                            set NewChar to (ASCII character leNum)
                            set x to i - 1
                            if x = 0 then set x to 1
                            set LeMotdebut to text 1 thru x of texte
                            set LeMotFin to text from (i + 1) to leNbchar of texte
                            if ledebut = 1 then
                                set texte to NewChar & LeMotFin
                            else
                                set texte to LeMotdebut & NewChar & LeMotFin
                            end if
                        end if
                    end if
                end repeat
                set nouveaunom to texte & "." & lextension as string -- le nouveau nom
                set name of file nom of un_dossier to nouveaunom
            end tell
        end repeat
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## byte_order (27 Mars 2018)

Foutue vieille version BSD de sed qui ne supporrte pas \U et \L dans macOS !
Désolé, j'oublie toujours l'âge des outils Unix dans macOS...


----------



## byte_order (27 Mars 2018)

Et avec "sed -E ..." ça passe toujours pas sous macOS ?


----------



## byte_order (27 Mars 2018)

@*zeltron54*

awk au secours du sed vieillot de macos alors:


```
echo "mon titre de MUSIQUE.mp3" | awk '{for (i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1'
```


----------



## zeltron54 (27 Mars 2018)

Effectivement avec awk cela fonctionne.
Youg009 n'aura qu'a choisie sa solution.


----------



## Youg009 (27 Mars 2018)

Déjà un tout grand merci pour vos réponses !

@byte_order
Si je comprends bien dans Automator je vais dans :
 => Action -> Bibliothèque -> Utilitaires -> Executer ...
Mais là je suis un peu perdu, lequel dois-je choisir ?
 - Executer Javascript
 - Executer un script AppleScript
 - Executer un script Sheel

@zeltron54
J'ai copié/collé ton script de la même manière qu'expliqué ci dessus en choisissant *Executer un script AppleScript*
Mais j'obtiens cette erreur :
_Le gestionnaire run est spécifié plus d’une fois ou il y a eu des commandes de haut niveau en plus du gestionnaire run._

Je découvre seulement cet outil puissant et je vous ne cache pas que je suis un peu perdu.
Bonne soirée


----------



## byte_order (27 Mars 2018)

Executer un script shell

Avec le nom du fichier, l'input, passé en "stdin"

et le code de script suivant :

```
awk '{for (i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1'
```

en sortie il faut mettre cela dans une variable et enchaine avec une action de renommage utilisant le nom d'origine et cette variable comme nouveau nom. Attention, il faut extraire le nom du fichier du chemin, sinon le chemin va se retrouver capitalisé lui aussi, et l)... c'est le drame.

Une autre solution est de faire l'opération de capitalisation *et* de renommage du fichier directement dans le script et retourner son nouveau nom, chemin inclu en sortie pour la suite des opérations, si y'a autre chose a faire que renommer le fichier :


```
#!/bin/bash

new_filename=$(echo $(basename "$1") | awk '{for (i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)} 1')
renamed_file="$(dirname "$1")/$new_filename"
mv "$1" "$renamed_file"
echo $renamed_file
```


----------



## zeltron54 (28 Mars 2018)

Youg009

Pour mon script,
Tu n'utilises plus automator.
Tu fais directement un copié, collé dans Editeur de script et tu exécutes c'est tout.

Dis-moi si tu as besoin de plus de détails.


----------



## sgamel (28 Mars 2018)

Youg009 a dit:


> Bonjour à tous,
> 
> Savez vous s'il est possible avec Automator de renommer des fichiers avec une *Case De Titre* mais sans impacter les mots en majuscules.
> 
> ...



OUI, et très simplement sans passer par des commandes Shell:


- Action: "Renommer des éléments du Finder"
- Options:
  - première option: sélectionner "Modifier la casse"
  - ensuite, choisir "nom de base seulement" (pour ne pas toucher l'extension) puis la valeur "Casse De Titre"


----------



## byte_order (28 Mars 2018)

Cette solution ne fonctionne pas avec des mots en MAJUSCULE dans le nom de fichier.
NASA.mp3 va devenir Nasa.mp3 avec cette méthode.


----------

