IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apple Discussion :

[Débutant] Renommer en masse dans le terminal


Sujet :

Apple

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut [Débutant] Renommer en masse dans le terminal
    Bonjour à tous,
    Après mainte recherches et... recherches, infructueuses, je me suis dit qu'il fallait créer un post

    J'ai souvent des fichiers à renommer, comme de la musique...
    Par exemple :
    01 - Artiste - Chanson.mp3

    ... J'ai opté pour notre ami automator, qui fait la chose très bien quand il s'agit d'enlever par exemple "Artiste - " (Une suite de caractères qui ne change pas)

    Mais il ne semble pas supporter les expressions régulières (que je ne maîtrise pas tant que ça d'ailleurs)...

    Alors j'ai cherché un peu une solution terminal, c'est cp à ce qu'il parait...
    Seulement je ne sais pas quelle est la façon de procéder pour le terminal, il me faudrait sûrement une boucle, un regex (enlever les premiers 5 caractères pas exemple) et puis c'est tout

    Voilà voilu, en espérant que c'est pas trop bête

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    733
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 733
    Points : 1 119
    Points
    1 119
    Par défaut
    La commande cp effectue une copie, mais pas un renommage. La commande de renommage/déplacement est "mv".

    Si tu recherches des processus automator, tu peux en trouver ici : http://www.apple.com/downloads/macosx/automator/

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mikysett Voir le message
    Bonjour à tous,
    Après mainte recherches et... recherches, infructueuses, je me suis dit qu'il fallait créer un post

    J'ai souvent des fichiers à renommer, comme de la musique...
    Par exemple :
    01 - Artiste - Chanson.mp3

    ... J'ai opté pour notre ami automator, qui fait la chose très bien quand il s'agit d'enlever par exemple "Artiste - " (Une suite de caractères qui ne change pas)

    Mais il ne semble pas supporter les expressions régulières (que je ne maîtrise pas tant que ça d'ailleurs)...

    Alors j'ai cherché un peu une solution terminal, c'est cp à ce qu'il parait...
    Seulement je ne sais pas quelle est la façon de procéder pour le terminal, il me faudrait sûrement une boucle, un regex (enlever les premiers 5 caractères pas exemple) et puis c'est tout

    Voilà voilu, en espérant que c'est pas trop bête
    http://www.manytricks.com/namemangler/ (donationware)
    http://www.publicspace.net/ABetterFinderRename/ (commercial)
    http://www.lifehacker.com.au/tips/20...renamer-2.html (freeware)

    sinon en terminal, les outils de base utiles sont :

    find ou ls pour sélectionner les fichiers à renommer
    perl, awk, sed pour faire le traitement du pattern
    test pour vérifier si le nom généré n'existe pas déjà…
    mv pour faire le changement de nom (l'option -i provoque la demande d'une confirmation si le fichier destination existe déjà…)


    mais si vous débuttez en Unix, soyez très prudent en expérimentant le rename de nombreux fichiers via la ligne de commande avec des patterns …
    les espaces, les ' et ", les <, > dans les noms de fichiers sont autant de pièges pour le shell Unix…

    (faites toujours une version du script qui génère ses commandes en sortie sans les exécuter et vérifiez si tout est correct avant toute exécution…
    vous pouvez même utilisez vi pour voir les commandes avant de les exécuter :

    dans terminal : lancer vi
    une fois dans vi exécuter la commande qui va lister les fichiers qui vous intéresse via la commande "read" (:r) et l'exécution en shell (le !)
    par exemple, ceci va lister les mpeg3 du directory courant
    générer les commandes "mv" via le find and replace (:s, le % indique tout le texte à partir du début)
    changer le nom de destination, ici toutes les extensions mpeg3 sont changées en mp3 (le $ dans le pattern signifie 'fin de ligne')
    et si tout est ok : pour exécuter réellement les commandes… via la commande write (:w) dans un shell (!), et sh désignant le programme recevant les commandes (un shell lui aussi…) (:w pathfilename écrira le texte dans un fichier)

    et pour quitter sans sauver (et sans exécuter)…
    )

  4. #4
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Merci Tarul pour le lien, mais j'avais déjà regardé... Rien de chez rien qui puisse faire ce dont j'ai besoin

    JeitEmgie... waouh... je suis vraiment nul dans le terminal, et de surquoit je ne me rappelle plus trop des expressions régulières... alors voilà j'ai peu compris

    Mais j'ai envie de faire ça par moi même dans le terminal plutôt que d'installer un énième soft.

    Alors voilà, laissons tomber vi... c'est si j'ai bien compris un "sandbox"... beh, on va dire que je copie les fichiers que je veux renommer et je travaille sur la copie, sa sera plus simple

    Après... la commande mv...

    Je n'ai pas même pu comprendre comment marchaient ses arguments (faut rien donner pour acquis )

    alors voilà, exemple pratique :
    enlever les trois premiers caractères à partir du début et garder le reste pour tous les fichiers du dossier où je me suis placé grâce à cd

    ...

    J'étais tenté de faire des choses comme :
    [3*][*] 2
    Mais évidemment, sa fait du bon temps que j'ai pas jeté un coup d'oeil à un regex, et là, bah, voilà le résultat

    Voilà voilu,merci d'avance, et puis, si vraiment sa vous embête j'vais chercher de la doc pour mv (avant j'savais même pas la commende à faire, s'est dur de chercher dans ces cas là )

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mikysett Voir le message
    Merci Tarul pour le lien, mais j'avais déjà regardé... Rien de chez rien qui puisse faire ce dont j'ai besoin

    JeitEmgie... waouh... je suis vraiment nul dans le terminal, et de surquoit je ne me rappelle plus trop des expressions régulières... alors voilà j'ai peu compris

    Mais j'ai envie de faire ça par moi même dans le terminal plutôt que d'installer un énième soft.

    Alors voilà, laissons tomber vi... c'est si j'ai bien compris un "sandbox"... beh, on va dire que je copie les fichiers que je veux renommer et je travaille sur la copie, sa sera plus simple

    Après... la commande mv...

    Je n'ai pas même pu comprendre comment marchaient ses arguments (faut rien donner pour acquis )

    alors voilà, exemple pratique :
    enlever les trois premiers caractères à partir du début et garder le reste pour tous les fichiers du dossier où je me suis placé grâce à cd

    ...

    J'étais tenté de faire des choses comme :
    [3*][*] 2
    Mais évidemment, sa fait du bon temps que j'ai pas jeté un coup d'oeil à un regex, et là, bah, voilà le résultat

    Voilà voilu,merci d'avance, et puis, si vraiment sa vous embête j'vais chercher de la doc pour mv (avant j'savais même pas la commende à faire, s'est dur de chercher dans ces cas là )
    en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ls *.mp3 | sed 's/\(.*\)/mv "\1" "\1"/' | sed 's/mv "\(.*\)" "...\(.*\)"/mv "\1" "\2"/'
    pour tester… et ajoutez " | sh" à la fin pour exécuter…

    dans vi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :r ! ls *.mp3
    :%s/.*/mv "&" "&"/
    :%s/mv "\(.*\)" "...\(.*\)"$/mv "\1" "\2"/
    notez l'ajout des " pour ne pas avoir de problèmes avec les noms de fichiers contenant des espaces…

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    JeitEmgie merci beaucoup, c'est maaaagique

    Seulement...
    C'est que sa marche, mais je ne comprend pas tout...
    Et, si sa vous emmerde pas, j'aimerais poser quelques questions (mais bon, si vraiment c'est chiant je vais chercher un tuto et vous laisser en paix, )

    Décomposons :

    ls *.mp3 | (sa liste tout ce qui fini par .mp3... j'imagine que c'est surtout parce que, en quelque sorte, sa "sélectionne" tout ce qui fini par .mp3 et sa nous permet de travailler dessus.. le "|", j'imagine que c'est pour passer la main à la commande d'après)


    sed 's/\(.*\)/mv "\1" "\1"/' | (... , sed, je suis perdu)


    sed 's/mv "\(.*\)" "...\(.*\)"/mv "\1" "\2"/' (... , idem)

    | sh (sa execute.. )

    C'est aussi qu'en cherchant des explications sur le web... c'est souvent trop vague, il n'y a pas assez d'explications,

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mikysett Voir le message
    JeitEmgie merci beaucoup, c'est maaaagique

    Seulement...
    C'est que sa marche, mais je ne comprend pas tout...
    Et, si sa vous emmerde pas, j'aimerais poser quelques questions (mais bon, si vraiment c'est chiant je vais chercher un tuto et vous laisser en paix, )

    Décomposons :

    ls *.mp3 | (sa liste tout ce qui fini par .mp3... j'imagine que c'est surtout parce que, en quelque sorte, sa "sélectionne" tout ce qui fini par .mp3 et sa nous permet de travailler dessus.. le "|", j'imagine que c'est pour passer la main à la commande d'après)


    sed 's/\(.*\)/mv "\1" "\1"/' | (... , sed, je suis perdu)


    sed 's/mv "\(.*\)" "...\(.*\)"/mv "\1" "\2"/' (... , idem)

    | sh (sa execute.. )

    C'est aussi qu'en cherchant des explications sur le web... c'est souvent trop vague, il n'y a pas assez d'explications,
    sed c'est un éditeur de fichier texte qui travaille ligne par ligne…
    il prend en paramètre la commande à exécuter sur chaque ligne
    ici c'est "s" pour substitute et ses paramètres :

    delimeter pattern à rechercher delimiter pattern de substitution delimiter

    le delimiter servant à borner le pattern, ici c'est /
    la règle étant : on prend un delimiter qui n'intervient pas dans le pattern à rechercher… (on aurait pu prendre $ par exemple…) pour éviter de devoir utiliser \ ce qui allourdi la lecture…


    le pattern à rechercher : .* soit toute la ligne mais comme on a besoin d'utiliser la valeur de ce que l'on trouve on le met entre parenthèses mais comme on ne cherche pas "n'importe quoi entre parenthèses" on doit les "escaper" d'où \(

    dans le pattern de susbtitution \1 signifie la valeur du pattern de recherche se trouvant dans le premier jeu de parenthèses (on peut avoir plusieurs jeux, le suivant sera \2, etc jusqu'à \9 max)

    et 's/.*/mv & &/' ferait exactement la même chose… avec une autre syntaxe : le & signifiant la dernière valeur prise dans le pattern recherché…


    le point important c'est les " pour éviter les problèmes avec les fichiers dont le nom contient des espaces…

  8. #8
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    merci encore, c'est déjà plus claire...

    Il y a cependant encore des choses assez vagues...

    Je me dis aussi que pour débuter vaut mieux ne pas utiliser sed...
    C'est un outil supplémentaire à expliquer, sa fait beaucoup

    Il y a aussi une chose, c'est que je ne vois pas où on lui dit d'enlever les trois premiers caractères... c'était plus facile en php

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mikysett Voir le message
    merci encore, c'est déjà plus claire...

    Il y a cependant encore des choses assez vagues...

    Je me dis aussi que pour débuter vaut mieux ne pas utiliser sed...
    C'est un outil supplémentaire à expliquer, sa fait beaucoup

    Il y a aussi une chose, c'est que je ne vois pas où on lui dit d'enlever les trois premiers caractères... c'était plus facile en php
    les ... ne sont pas dans les parenthèses du 2ème pattern…

  10. #10
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    okok...
    Mais...

    pourquoi on utilise deux fois la commande s et 4 fois la commande mv?

    il ne suffirait pas de :
    mv "\(.*\)" "...\(.*\)"
    Car, si j'ai bien compris, il dit de prendre tout le nom et de substituer par tout le nom moins les trois premiers chiffres.

    D'ailleurs je n'ai pas compris pourquoi on dit .* et pas * (puisque apparemment les deux désignent "tout".

    Enfin bref, j'ai déjà saisi plus que je n'espérais

    Merci encore !

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par mikysett Voir le message
    okok...
    Mais...

    pourquoi on utilise deux fois la commande s et 4 fois la commande mv?

    il ne suffirait pas de :
    mv "\(.*\)" "...\(.*\)"
    Car, si j'ai bien compris, il dit de prendre tout le nom et de substituer par tout le nom moins les trois premiers chiffres.

    D'ailleurs je n'ai pas compris pourquoi on dit .* et pas * (puisque apparemment les deux désignent "tout".

    Enfin bref, j'ai déjà saisi plus que je n'espérais

    Merci encore !
    * signifie 0 ou plusieurs fois le pattern précédent
    . signifie n'importe quel caractère

    donc il faut vraiment faire .* car * tout seul ne signifie rien…

    (on peut écrire [A-Z]* qui signifie n'importe quel caractère de A à Z, pris 0 ou plusieurs fois…)

    on ne fait pas plusieurs mv : il apparaît plusieurs fois dans les patterns …

    si l'on veut faire la substitution en 1 seul sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed 's/\(...\)\(.*\)/mv "\1\2" "\2"/'

  12. #12
    Membre à l'essai
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup,
    sa y est, j'y suis... j'ai épuisé les questions

    C'est nickel, maintenant j'renomme en un tour de main

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/02/2010, 16h36
  2. Impossible de renommer une table dans FireBird
    Par WebPac dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2006, 12h12
  3. [Débutant] Triage de données dans un String
    Par Poilou dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/01/2004, 16h21
  4. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 01h59
  5. [] [Réseau] Renommer des fichiers dans un site FTP
    Par JerBi dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 22/08/2003, 00h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo