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 pour scanner fichiers


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Par défaut Script pour scanner fichiers
    Bonjour,
    voici mon problème.
    J'ai grossomodo 1 millions de fichiers disséminés une arborescence de dossier du type ./yyyy/mm/dd (année mois jour).
    La 3ème ligne du header de chacun de ces fichiers doit se terminer par la lettre K. Or, il est possible que pour certains d'entre eux (peu pour moi serait le mieux) la 3ème ligne ne se termine pas par cette lettre.
    Je voudrais donc écrire un script permettant de scanner l'intégralité des fichiers, de repérer ceux n'ayant pas la bonne 3ème ligne et de les copier dans un répertoire temporaire.
    Pouvez vous SVP m'aiguiller?
    Merci beaucoup

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    Bonjour,

    tu rediriges la sortie de find vers le read d'une boucle while, dans laquelle tu extrais le dernier caractère de la troisième ligne du fichier en cours avec sed pour tester s'il vaut "K".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par cpalperou Voir le message
    Bonjour,
    Je voudrais donc écrire un script permettant de scanner l'intégralité des fichiers, de repérer ceux n'ayant pas la bonne 3ème ligne et de les copier dans un répertoire temporaire.
    Pouvez vous SVP m'aiguiller?
    Merci beaucoup
    si c'est temporaire il est inutile de copier les fichiers tu fais une liste des fichiers dans /tmp/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec grep -l ".*..K$" {} \; > /tmp/toto
    ça donne une liste sous la forme :
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sh-4.2$ touch {a,b,c,d,e,f,g,h,i,j}
    sh-4.2$ ls
    a  b  c  d  e  f  g  h  i  j
    sh-4.2$ echo "cvK" >k
    sh-4.2$ echo "cvK" >l
    sh-4.2$ find . -type f -exec grep -l ".*..K$" {} \; 
    ./l
    ./k
    sh-4.2$ rm [a-l]

    après il te reste plus qu'à relire ton fichier temporaire pour lancer un éventuel traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while read
    do 
    #traitement de $REPLY
    done < /tmp/tonfichier_de_liste
    donc en une seule passe ça devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while read
    do 
    #traitement de $REPLY
    done < $( find /chemin/de/depart -type f -exec grep -l ".*..K$" {} \; 2> /dev/null )

  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 frp31 Voir le message
    si c'est temporaire il est inutile de copier les fichiers tu fais une liste des fichiers dans /tmp/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec grep -l ".*..K$" {} \; > /tmp/toto
    ça marche, ça, pour tester si la 3ème ligne finit par K?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec sh -c "head -3 {} | tail -1 | egrep -q -v 'K$' && echo {}" \; > /tmp/liste_fichiers.txt
    y a probablement plus rapide...

    Sinon, on peut aussi copier directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec sh -c "head -3 {} | tail -1 | egrep -q -v 'K$' && cp {} /le/repertoire" \;
    BUG: ça rend un faux-positif pour un fichier de moins de 3 lignes (donc 1 ou 2) dont la dernière ne se termine pas par K.

  5. #5
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Sinon, on peut aussi copier directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec sh -c "head -3 {} | tail -1 | egrep -q -v 'K$' && cp {} /le/repertoire" \;
    BUG: ça rend un faux-positif pour un fichier de moins de 3 lignes (donc 1 ou 2) dont la dernière ne se termine pas par K.
    Changer head -3 {} | tail -1 | par sed -n '3p' {} |

  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 zipe31 Voir le message
    Changer head -3 {} | tail -1 | par sed -n '3p' {} |
    Ah ben ouais!
    Va vraiment falloir que je mette à sed...

  7. #7
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ah ben ouais!
    Va vraiment falloir que je mette à sed...
    Et à awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /chemin/de/base -type f -exec  awk 'NR==3 && $NF =! /K$/ { print FILENAME }' {} \;
    PS. Je laisse le soin aux fortiches en awk de rajouter la commande qui va bien pour copier directement les fichiers dans /tmp... merci

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

Discussions similaires

  1. Généraliser script pour plusieurs fichiers
    Par lovelace63 dans le forum Langage
    Réponses: 5
    Dernier message: 11/11/2012, 10h50
  2. script pour scanner
    Par a_allatiff dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/10/2010, 20h47
  3. Script pour modifier fichier "host"
    Par chuispasla dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 05/08/2009, 14h03
  4. script pour parsing fichier xml
    Par Melvine dans le forum Modules
    Réponses: 4
    Dernier message: 06/10/2006, 18h47
  5. script windows pour copier fichier
    Par sacan dans le forum Windows
    Réponses: 3
    Dernier message: 09/06/2006, 12h24

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