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 :

[script] Trouver des fichiers contenant un numéro de téléphone


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut [script] Trouver des fichiers contenant un numéro de téléphone
    Bonjour
    S'il vous plait,J'ai besoin d'aide je suis perdu. j'ai eu un exercice à faire (parmi plusieur exercice) par un recruteur.

    l'exercice dit :

    Considérant que nous avons 50 000 fichiers HTML contenus dans une arborescence Unix, sous un répertoire s’appelant ‘/website’. Nous avons deux (2) jours pour obtenir la liste des chemins de chaque fichier HTML contenant des numéros de téléphone, selon les deux (2) formats suivants: (999) 999-9999 and 999-999-9999. Écrivez l’algorithme qui permettra de fournir la liste.
    Deja je comprend pas bien l'exercice, demande un algorithme qui founir la liste des chemins de chaque fichier html dans le repertoire website.

    Ce que je suis entraine de faire moi c'est d'accèder au repertoir website et parcourir tout les fichier et voir si il y'a un numero sous format 999 999-9999 , si oui j'affiche le nom d fichier. mais cela aussi ne marche pas :s aide svp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #!/bin/sh
    #je suis actuellement en desktop
     
    for fichier in ./website
    do
     
      grep -e "[0-9][0-9][0-9] [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" $fichier
      if[ $? -eq 0]
      then
     
             echo $fichier>>resultat.txt
     
      fi
    done

    Cordialement

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    Citation Envoyé par SysHic
    Deja je comprend pas bien l'exercice, demande un algorithme qui founir la liste des chemins de chaque fichier html dans le repertoire website.
    Citation Envoyé par recruteur
    Écrivez l’algorithme qui permettra de fournir la liste.
    c'est pas super bien formulé, mais moi, je comprends : «Écrivez l'algorithme qui permettra [d'écrire le programme, qui, lui,] permettra de fournir la liste.»

    tu peux pas contacter le recruteur pour lui demander quelques éclaircissements ?

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Bonjour,

    Dans /website, tu as une arborescence que tu dois parcourir pour chercher dans les fichiers HTML s'il y a des n° de téléphone dans l'un des 2 formats cités et si c'est le cas, alors afficher le nom du fichier (donc arborescence comprise).

    Ici, un simple grep avec les options qui vont bien devrait suffire, ou un find + grep lié par un -exec (pour les versions de grep qui ne supporte pas le récursif).

    EDIT: Non, find + grep car le grep tout seul ne permettra pas de filtrer juste les fichiers HTML des autres fichiers.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos réponse.

    voile ce que j'ai fais comme script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
     
    for fichier in ./website/*
    do
     
      grep -l "[0-9][0-9][0-9] [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" $fichier >> Resultat.txt
     
    done
    Il marche bien : je parcours les fichiers dans le répertoire website et je test si les fichiers contient le numéro sous format 999 999-9999 , si oui je stocke le chemin du fichier dans le fichier resultat.txt( a la fin dans le resultat.txt j'aurai tous les liens des fichiers.

    Mais : 1) je sais pas coment precise que les fichier .html dans mon script ,
    2) je ne sais pas comment ajoute le test sur le 2eme formule (999) 999-9999, et ce que j'ajoute un autre grep comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      grep -l "([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" $fichier >> Resultat.txt
    Merci

    Cordialement

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Bonjour

    poser des questions, c'est bien. Lire les réponses, c'est mieux. (find + grep)

    Non seulement ton script ne repère pas les html, mais il ne reste qu'à la racine de l'arborescence.

    Pour l'expression régulière, il n'y a pas de OU. | ou \|
    Bizarre.

    J'imagine que ce sont les numéros de téléphones qui doivent être récupérés. Pas les lignes ou les noms de fichiers. Intéresse-toi à l'option -o de grep.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour réponse.

    Mais juste pour votre information , Avant que je demande de l'aide ici , j 'ai tout testé OK. find + grep aussi mais ne marche pas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ./website -name *.html -type f |   grep -l "[0-9][0-9][0-9] [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" $fichier >> Resultat.txt

    et j'ai meme mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ./website -name *.html -type f |   grep -l "[0-9][0-9][0-9] [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] \| "[0-9]([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"" $fichier >> Resultat.txt
    Masi ne marche pas , et d'ailleurs c'est pour cela je suis la ,

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 118
    Points : 28 507
    Points
    28 507
    Par défaut
    ça ne marche pas n'est pas un message d'erreur.

    Pose toi les bonnes questions :
    • D'où tes lignes de commandes tireraient-elles la valeur de la variable $fichier ?
    • Que retourne la commande find ?
    • As-tu testé ton expression régulière sur un seul fichier pour vérifer qu'elle trouve les bonnes lignes ?

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Intéresse-toi à xargs (à placer entre le find et le grep).

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    sa march pa sa march pa...

    je suis d'accord avec Flodelarab, non content d'arriver à utiliser les commandes pour trouver son bonheur il va aussi être question d'optimiser un peu le traitement sur 50000 fichiers, xargs à la rescousse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -L /website/ -type f -name "*.html" -print0 | xargs -0 -n100 -P$(grep -c "^processor" /proc/cpuinfo) grep -lP "(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}"
    • l'option -L parcequ'on sait jamais, des fois qu'il y ait des répertoires sous forme de liens symboliques par exemple
    • l'option -type f parcequ'on ne sait jamais, des fois que quelqu'un ait eu la bonne idée de créer "repertoire.html/"
    • l'option -print0 parceque le nom du fichier peut éventuellement comporter des caractères spéciaux, à minima des espaces
    • et pour xargs pareil, l'option -0 pour récupérer la sortie en print0 du find
    • l'option -n100 pour spécifier qu'on traite les fichiers par lots de 100
    • l'option -P pour paralléliser la recherche sur $(grep -c "^processor" /proc/cpuinfo) threads, c'est à dire autant que c'est judicieux finalement
    • et sur le dernier grep, l'option -l pour afficher le nom du fichier dès la première occurrence trouvée et arrêter le traitement du fichier en cours
    • l'option -P pour utiliser les regex pcre... à vérifier mais je suis pas certain que les quantifieurs {x,y} fonctionnent avec les regex POSIX ou étendues...

  10. #10
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par disedorgue Voir le message
    EDIT: Non, find + grep car le grep tout seul ne permettra pas de filtrer juste les fichiers HTML des autres fichiers.
    Comme nous sommes dans GNU/Linux, si l'option globstar du shell est activée, je ne vois ce qui empêcherait un grep -r -l 'motif' /chemin/**/.*html de faire son boulot

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 830
    Points
    12 830
    Par défaut
    C'est vrai que l'on peut le faire comme tu le montres (la typo en moins ), mais pour 50.000 fichiers, cela peut poser certains problèmes...

    Pour s'amuser, on pourrait aussi le faire en pure Built-in ...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,


    Comme nous sommes dans GNU/Linux, si l'option globstar du shell est activée, je ne vois ce qui empêcherait un grep -r -l 'motif' /chemin/**/.*html de faire son boulot
    le -r n'est pas nécessaire si ? vu que tu mets déja **/*.html

    J'aurais dit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egrep -l "\([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]|[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" ./website/**/*.html

Discussions similaires

  1. Trouver les fichiers contenant des annotations
    Par lahitsitely78 dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 18/02/2009, 12h52
  2. Trouver les fichiers contenant un mot avec FINDSTR
    Par soazig dans le forum Windows XP
    Réponses: 4
    Dernier message: 26/04/2007, 15h29
  3. [Regexp] pattern pour trouver des fichiers par exclusion d'extension
    Par mnementh64 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 07/09/2006, 11h34
  4. Renommer des fichiers contenant des espaces
    Par MatRem dans le forum Linux
    Réponses: 6
    Dernier message: 28/04/2006, 09h21
  5. Trouver un fichier contenant une chaine ?
    Par narmataru dans le forum Linux
    Réponses: 2
    Dernier message: 29/04/2004, 11h49

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