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 GNU Discussion :

Instructions complexes après find


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Par défaut Instructions complexes après find
    Bonjour
    Je souhaiterais réaliser une suite de commandes plus ou moins complexes que l'option -exec de find ne me permet pas d'exécuter. Mais j'ai un problème récurrent avec la prise en charge des espaces.
    Par exemple avec cp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    find -name '*.pdf' -print | while read
    do
    filename="${REPLY#./}"
    filename2=${filename// /\ }
     cp $filename2 essai_${filename2}
     done
    Je supprime tout d'abord le "./" au début du nom du fichier, puis je met des backslash devant les espaces pour que la commande cp puisse interpréter le nom correctement.
    Pourtant quand j'exécute le script en mode déboggage, on voit bien que les espaces sont toujours présents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cp fichier 1.pdf essai_fichier 1.pdf
    cp: la cible «*1.pdf*» n'est pas un répertoire
    Une idée ?
    Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut UMQ!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    find -name '*.pdf' -printf '%p|%f\n' | while IFS='|' read f f2
    do
       cp "$f" "essai_${f2// /\ }"
    done
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Par défaut
    Merci
    En fait le "essai_${f2// /\ }" est inutile, il y a des des backslashs dans le nom des fichiers modifiés après ça. Si on le remplace par essai$f, ca marche très bien par contre

    Edit : en fait j'ai une question, est il possible d'obtenir le chemin absolu du fichier après printf ? Je ne vois aucune option qui permettrais de le faire dans le manuel de find.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par raphael2202 Voir le message
    Edit : en fait j'ai une question, est il possible d'obtenir le chemin absolu du fichier après printf ? Je ne vois aucune option qui permettrais de le faire dans le manuel de find.
    Si ton find cherche dans un répertoire absolu find /chemin/absolu -f ... alors tu auras automatiquement les fichiers avec leur nom absolu!

    Sinon (avec '.' ou un autre répertoire relatif), tu auras un nom relatif, auquel cas tu peux obtenir le chemin absolu du fichier en utilisant $(cd -P "$(basename $f)"; pwd)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Par défaut
    D'accord, merci pour l'aide

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    find -name '*.pdf' -printf '%p|%f\n' | while IFS='|' read f f2
    do
       cp "$f" "essai_${f2// /\ }"
    done
    ...
    ?
    sous réserve qu'aucun nom de fichier ou répertoire ne contienne de '|'...

    Ne peut-on faire qch comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name '*.pdf' -exec sh -c 'f="{}"; cp "${f}" "essai_${f}"' \;

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

Discussions similaires

  1. Calcul espace disque de fichier spécifique (après find)
    Par Chochal dans le forum Shell et commandes GNU
    Réponses: 44
    Dernier message: 26/10/2011, 16h41
  2. Réponses: 4
    Dernier message: 02/08/2011, 09h15
  3. lancer instruction juste après le load
    Par zilien974 dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/02/2011, 10h21
  4. [Batch] recuperer n lignes apres find
    Par Doksuri dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 25/01/2010, 13h28

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