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

Shell et commandes POSIX Discussion :

Utilisation de find -exec


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut Utilisation de find -exec
    Bonjour

    j'ai dans 1 dossier plusieurs fichiers flac de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Meredith Brooks - 07 - My Little Town.flac
    Je cherche a les renommer en supprimant le début jusqu'au chiffre.
    Dans un premier temps, j'affiche les noms obtenus avec 1 script intermédiaire.
    puis avec find, j'obtiens bien ce que j'attend .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    copie.sh
    #!/bin/sh
    echo "${1#*- }"
    ----------
    find . -name "*.flac" -exec ./copie.sh {} \;
    ----------
    07 - My Little Town.flac
    J'aimerais me passer du script intermédiaire en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.flac" -exec echo "${{}#*- }" \;
    J'ai essayé plusieurs combinaisons en protégeant les {, le $, ...
    J'obtient mauvaise subtitution, aucun fichier ou dossier de ce type, etc.
    Bref, je ne sais pas comment faire surtout que pour le renommage, il me faudra 2
    référence a {}.
    1 pour la construction du nouveau nom et 1 pour le mv.

    OpenBSD 6.0 GENERIC.MP#2319 amd64

    Cordialement.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    est-ce que tu disposes de la commande rename ? auquel cas un truc du genre fait peut-être l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.flac" -exec rename -n 's/.+?- (?=\d+)//' {} +
    et si ça semble ok il suffit de faire sauter le -n.

    pour détailler un peu la regex, on substitue le pattern .+?- (?=\d+) par rien
    • .+?- va prendre tous les caractères jusqu'au premier caractère moins rencontré (c'est à ça que sert le point d'interrogation), suivi d'un espace
    • et puis... sait-on jamais, on relance malencontreusement la commande et on a pas envie que ça pète tous les fichiers pour autant, donc on s'assure que notre pattern était bien suivi d'un chiffre ou plusieurs (\d+), mais ces chiffres on veut les garder, donc on met le tout dans un lookahead ((?=...))

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Merci pour la réponse mais je n'ai pas rename.
    Je suis arrivé a mes fins en construisant le script dans le exec en tenant compte de la remarque pour une relance malencontreuse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec sh -c 'rep="{}"; fich=${rep#*- }; rep=${rep%/*}; mv "{}" "$rep/$fich"' \;
    Cordialement.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,

    C'est ok avec rename également sur Linux debian 4.9.0-2-amd64 #1 SMP Debian 4.9.13-1 (2017-02-27) x86_64 GNU/Linux

    Merci.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Je suis arrivé a mes fins en construisant le script dans le exec en tenant compte de la remarque pour une relance malencontreuse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec sh -c 'rep="{}"; fich=${rep#*- }; rep=${rep%/*}; mv "{}" "$rep/$fich"' \;
    Tu peux simplifier ta commande grâce à l'option "execdir" de "find":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -execdir sh -c 'fich="{}"; mv "${fich}" "${fich#*- }"' \;
    EDIT: il faut des guillemets autour de {} dans l'affectation! (merci ctac_)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    ok, merci.
    ça fonctionne aussi avec une correction mineure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -execdir sh -c 'fich="{}"; mv "${fich}" "${fich#*- }"' \;
    autrement on a Cordialement,

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Je viens apporter une petite modification - correction.
    Si j'ai un fichier qui s'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ke$ha - 01 - Cannibal.flac
    Le find me renvoie bien le nom du fichier.
    Par contre l'affectation me renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./Ke - 09 - Animal.flac
    ce qui fait échouer la commande mv
    car le shell substitue la variable $ha
    il faut donc écrire pour éviter la substitution.
    La commande devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec sh -c "fich='{}'; mv "'"$fich" "${fich#*- }"' \;
    Cordialement.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    La commande devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec sh -c "fich='{}'; mv "'"$fich" "${fich#*- }"' \;
    Ahhh... La joie des simples et doubles quotes!

    Euh... (pardon pour le réchauffé) J'ai un doute, là... ça marche avec -exec au lieu de -execdir ???
    Il me semble que ${fich#*- } va supprimer le répertoire de destination, non?

    [EDIT] Oops! j'avais pas fait attention au "-maxdepth 1"... qui ruine ma remarque...

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    pour éviter cet imbroglio d'apostrophes et de guillemets, pensez aux paramètres positionnels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec /bin/sh -c 'fich="$1"; mv "$fich" "${fich#*- }"' sh {} \;
    le premier sh (/bin/sh) appelle le shell;
    le dernier sh deviendra le paramètre positionnel n°0 du shell appelé avec l'option -c, on aurait pu mettre n'importe quoi, mais par souci de cohérence (dans un script, le paramètre n°0 est le nom du shell) j'ai mis sh;
    quant à {}, il deviendra donc le premier paramètre positionnel !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Une version améliorée du script précédent qui limite les appels au shell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -maxdepth 1 -name "*.flac" ! -name "[0-9][0-9]*" -exec /bin/sh -c 'for i do echo mv "$i" "${i#*- }";done' sh {} +
    ɹǝsn *sıɹɐlos*

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Merci pour ces explications et améliorations
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OS X] [SH] Utilisation de find et -exec
    Par medmaysais dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 13/03/2016, 21h11
  2. utilisation de {} dans find -exec et commandes imbriquées
    Par pitipoisson dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 07/09/2009, 11h56
  3. Utilisation de find
    Par Fry dans le forum Administration système
    Réponses: 2
    Dernier message: 02/11/2006, 15h39
  4. [C++ .NET] Comment utiliser fonction Find ?
    Par thecrax dans le forum Framework .NET
    Réponses: 3
    Dernier message: 17/08/2006, 09h02
  5. [VBA-E] Pb avec l'utilisation de .Find
    Par belfaigore dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2006, 07h38

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