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 :

Copier dans un répertoire les fichiers dont le contenu contient une chaine de caractères


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut Copier dans un répertoire les fichiers dont le contenu contient une chaine de caractères
    Bonjour,

    J'ai isolé la commande suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find 5_répertoire contenant les fichier extraire -name "*" -exec grep -Hn --color "cha^ne de carractère" {} \;
    Pour copier les fichier correspondant vers un répertoire de destination, j'essaie de passé par la commande suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    co -R -v find 5_répertoire contenant les fichier extraire -name "*" -exec grep -Hn --color "cha^ne de carractère" {} \; répertoireDestination
    mais ça ne semble pas fonctionner.

    Est-ce que quelqu'un pourrais m'expliquer pourquoi et me mettre sur la piste d'une solution ?

    Merci pour votre support

    Salutations
    Battant

  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,

    t'es effectivement pas très loin, y'a plusieurs façons de faire, en voici quelques unes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    find repertoire/ -type f -exec sh -c 'grep -Hn --color=always "chaine" {} && cp {} destination/' \;
    grep -lZ "chaine" repertoire/** | xargs -0 -I{} cp {} destination/
    cp $(find repertoire/ -type f -exec grep -l "chaine" {} \;) destination/
    la première méthode utilise find et lui demande d'exec un sous-shell dans lequel on peut alors chainer plusieurs commandes, l'astuce repose sur le code de sortie de grep et l'enchainemen logique && (comprendre que si grep trouve la chaine il retourne 0 et donc la commande suivante est lancée, sinon elle ne l'est pas), on a d'un coté l'affichage de grep, de l'autre la copie du fichier, le tout en réutilisant le paramètre {} mis à disposition par find

    la deuxième méthode tire parti des possibilités de globing de bash 4, on peut se passer du find en faisant directement un grep repertoire/** qui descendra dans les sous-répertoires tout seul comme un grand
    on passe le tout à xargs qui redistribue à cp au fur et à mesure

    la dernière méthode est la plus proche de ce que tu essayais de faire, c'est à dire partir directement sur cp en lui donnant comme paramètre directement la liste des fichiers à copier, le dernier paramètre étant le répertoire de destination, pour ça il suffisait d'encadrer le find dans un sous-processus $()

  3. #3
    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 387
    Points
    19 387
    Par défaut
    Bonjour,

    l'option globstar ne me paraît pas utile, étant donné qu'il n'y a pas de recherche sur un format de nom de fichiers particulier.
    pourquoi ne pas faire une recherche récursive (-R) avec grep ?

    le dernière solution peut ne pas fonctionner correctement si les noms de fichiers comportent des espaces...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut grep et les fichiers et dossiers dont le nom contiennent des espace.
    Bonjour,

    Merci pour vos renseignements précieux.

    Malheureusement j'ai le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No such file or directory
    qui apparait plusieurs fois de suite


    surtout avec grep alors que je suis presque sûr que le fichier existe

    Est-ce due au fait que le nom des espace ?

    Comment contourner ce problème ?

    Merci d'avance pour votre aide

    Salutations
    Battant

  5. #5
    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 387
    Points
    19 387
    Par défaut
    avec quelle commande ?
    avec quels fichiers ?

    si les fichiers comportent des espaces (ou autre), il faut privilégier les deux premières solutions; en ajoutant des guillemets autour des accolades qui suivent la commande cp.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour,

    La dernière commande n'affiche rien sur la sortie standard

    Pourquoi ?

    Merci pour votre réponse

    Salutations
    Battant

  7. #7
    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,

    Citation Envoyé par Battant Voir le message
    La dernière commande n'affiche rien sur la sortie standard
    Pourquoi ?
    parceque le propos de la commande est de copier et pas d'afficher, la liste de fichiers censée être "affichée" par find est utilisée comme liste d'arguments pour cp qui lui fait son boulot silencieusement si la commande réussit, ce qui sous-entendrait qu'elle n'a pas rencontré de fichier avec des espaces dans leur nom

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,
    @bufferbob: pour le problème d'espace, la syntaxe suivante devrait faire le travail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find repertoire/ -type f -exec grep -q "chaine" {} \; -exec cp {} destination/ \;
    Cordialement.

  9. #9
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,
    @bufferbob: pour le problème d'espace, la syntaxe suivante devrait faire le travail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find repertoire/ -type f -exec grep -q "chaine" {} \; -exec cp {} destination/ \;
    Bonjour,

    Merci ça a marché avec votre commande.

    Salutations
    Battant

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2015, 08h47
  2. Réponses: 3
    Dernier message: 26/07/2011, 19h27
  3. Supprimer dans un répertoire les fichiers d'un type donné
    Par oodini dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 28/04/2010, 11h10
  4. Réponses: 11
    Dernier message: 20/08/2009, 22h27
  5. rechercher les enregistrements dont un champ contient une chaine
    Par faabriice dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/06/2008, 13h58

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