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 :

Bash suppression entre borne


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut Bash suppression entre borne
    Bonjour,
    je cherche actuellement un script bash qui me permettrais de supprimer plusieurs lignes (ligne entière) qui sont entre deux borne. Prenons par exemple le fichier.txt ci dessous:
    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
    16
    17
    18
    19
    20
    21
    22
    texte3.txt 8c132aaec5bf35632b26ff6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
     attention
     mou
     fefp
     ezfz
    texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
     bash
     systeme
    texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
     avion
     manger
     vomir
    texte4.txt 8c132aaec5bf42jtjtyjyj6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
     atefgfdgd
     ateg
     atehtdh
     atehg
     atekyu
    texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/texte2.txt
     fzefze
     fezfezf
     zkejzo
    Je veux donc supprimer texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt ainsi que son contenu mais je ne veux pas supprimer texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt ni son contenu. En gros c'est une sorte de suppresion de fichier recent et de son contenu pour le remplacer par le nouveau. Le probleme etant que je ne veux pas supprimer autre chose que l'ancien fichier.txt et son contenu.

    Pour tous ce qui est variable j'ai pu les recuperer avec des cut. J'ai donc deja des variable pour l'empreinte/le nom/l'adresse. J'ai vu que l'on pouvais faire cet suppresion grace au sed -i mais je n'ai pas reussi a faire quoi que ce soit de plus.
    PS: Le fichier texte sera toujours tu meme type. C'est a dire qu'il est du type :
    nomfichier.txt empreinteMD5 chemind'acces
    mot1
    mot2
    mot3
    mot4
    etc
    nomfichier2.txt empreinteMD5 chemind'acces
    mot5
    mot6
    mot7
    etc


    merci d'avance

  2. #2
    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 cimestro Voir le message
    Bonjour,
    je cherche actuellement un script bash qui me permettrais de supprimer plusieurs lignes (ligne entière) qui sont entre deux borne.
    Pas très clair: quelles sont ces bornes?
    Comment sont-elles définies?

    Je veux donc supprimer texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
    Pas très clair: tu veux supprimer cette ligne-ci du fichier "fichier.txt"?
    c'est-à-dire qu'après le passage du script, le fichier "fichier.txt" ne contienne plus cette ligne?
    mais contienne toutes les autres lignes?

    ainsi que son contenu
    Pas très clair: "son contenu"? le contenu de qui?
    Tu veux supprimer le contenu du fichier dont le nom est le 3ème champ de la ligne?
    c'est-à-dire supprimer le contenu du fichier "/mnt/d/travailIUT/projet/dossier1/texte2.txt", c'est-à-dire en faire un fichier existant mais vide?
    Ou bien tu veux supprimer le fichier "/mnt/d/travailIUT/projet/dossier1/texte2.txt", c'est-à-dire en faire un fichier inexistant?

    mais je ne veux pas supprimer texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt ni son contenu.
    Pas très clair: pourquoi ne veux-tu pas supprimer cette ligne?
    Parce que "jiujfe5c28cf78a72f11456f4fe8b7af" commence par 6 lettres, alors que "f17d0e5c28cf78a72f1187140738b7af" ne commence que par une lettre?
    Il faudrait nous donner un peu plus précisément les critères qui guident tes choix.

    En gros c'est une sorte de suppresion de fichier recent et de son contenu pour le remplacer par le nouveau. Le probleme etant que je ne veux pas supprimer autre chose que l'ancien fichier.txt et son contenu.
    Pas très clair: d'où vient la notion de récent?
    C'est quoi le nouveau dont tu parles? Où est-il? D'où vient-il? Où va-t-il?

    Comme dirait N_BaH, pourrais-tu nous montrer le résultat que tu souhaites obtenir?

    Je ne sais pas si les autres contributeurs ont réussi à comprendre ton intention, mais, pour moi

  3. #3
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    De base j'ai un BDD qui se fais sur un fichier txt. Cette bdd se fais de la façon suivante:

    Pour chaque fichier.txt dans un dossier et les sous dossiers:
    je recup et j'ecrit sur une ligne : son nom / son empreinte MD5 / son chemin d'acces
    je recup chaque ligne (une ligne = un mot ) de ce fichier et je l'ai ecrit en sautant a la ligne entre chaque mot. De plus j'y indique son nombre d'occurence et les numero de ligne ou ils apparaient.

    Le probleme etant que je dois également faire attention a ne pas ecrire deux fois le fichier. J'ai deja reussi a traiter si le fichier a le meme nom ainsi que la meme adresse md5 alors je ne rajoute pas le fichier dans la bdd.
    Par contre si le fichier porte le meme nom, la meme adresse, mais un md5 different alors je dois supprimer l'ancien fichier ( son nom / son empreinte MD5 / son chemin d'acces) et également son contenu qui peut donc etre plusieurs ligne ( mot / occurence /numeroligne ) contrairement a la ligne portant le nom/md5/adresse qui n'est donc que une fois pour chaque fichier.
    Je sais juste deux chose. Je dois donc supprimer le nomdufichier.txt qui a repondu au test ( meme nom meme adresse mais md5 different ) jusqu'a l'autre fichier.txt. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fichier1.txt
     mot 1 1
     mota 2 2 3
     avion 1 4
    fichier2.txt
    marque 2 1 2
    pour 1 3
    Mon but dans cet exemple: admettons que je change fichier1.txt en supprimant tous son contenu et en mettant: attention a la ligne 1 et bateau a la ligne 2. Alors en relançant le script j'aurais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fichier1.txt
     attention 1 1
     bateau 1 1
    fichier2.txt
    marque 2 1 2
    pour 1 3
    J'ai deja tous le script qui fait la bdd. Je veux donc juste un sed/awk/grep ou autre qui supprime ce que je veux ( expliquer au dessus ) et que je puisse mettre avant l'ecriture dans la bdd sachant que j'ai deja en code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       for i in find -name "*"".txt"
             name=$(basename $i) #recupération du nom fichier
             empreinte=$(md5sum $i) #recuperation de l'empreinte fichier
             echo $name $empreinte >> $cheminbash"/bdd.txt" #on mets name et empreinte dans la bdd.txt
    j'ai encore beaucoup de chose mais je n'ai pas accès a tous. J'ai le deja le if. Je voudrais donc que vous m'aidez pour le sed/awk/grep qui prends comme borne "*"".txt" de la ligne information fichier et qui s'arrete a "*"".txt" de la ligne information fichier ( je dis ça parce que il est possible que un mot dans le fichier soit qqlchose.txt. Voila j'espere avoir été assez clair. Meme si j'en doute. N'hesiter pas a me poser toute vos question. Merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ne te serait-il pas possible de travailler en amont : avant d'enregistrer les données d'un fichier, vérifier dans le fichier log si la dernière "instance" concerne le fichier de données qui va être traité ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    non ça n'est pas possible :/

  6. #6
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    si ça peut vous aidez. Je cherche a faire la partie "si le fichier a été modifié, on lance l'indexation c++". c'est la prog c++ qui va me faire les comptage de ligne et des mots

    "--index" parcoure l'ensemble des répertoires/sous-répertoires à partir de celui donné par l'utilisateur. Pour chaque fichier, on crée son empreinte md5 et on la compare avec celle existante dans la base. Si le fichier n'a pas été modifié, il est déjà indexé, on ne lance pas le programme C++. Si le fichier a été modifié, on lance l'indexation (C++), on efface dans la base (si elles existent) les informations de ce fichier, on calcule son nouveau md5. Au retour du programme C++, on stocke les informations dans la base (nom, chemin, md5, liste des mots, des occurrences et des lignes)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    tu dois faire un effort de présentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Pour chaque fichier, 
            on crée son empreinte md5 et 
            on la compare avec celle existante dans la base. 
                    Si le fichier n'a pas été modifié, il est déjà indexé, on ne lance pas le programme C++. 
                    Si le fichier a été modifié, 
                            on lance l'indexation (C++), 
                            on efface dans la base (si elles existent) les informations de ce fichier, 
                            on calcule son nouveau md5. 
                            Au retour du programme C++, 
                            on stocke les informations dans la base (nom, chemin, md5, liste des mots, des occurrences et des lignes)
    tu y verras aussi plus clair.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Oui désolé j'ai un peu du mal en présentation. Merci

  9. #9
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    je n'ai toujours pas avancé. Je vous envoie de mon code pour essayé de vous preciser mon probleme :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    for i in `find -name "*"".txt"` #boucle for (arborescence fichier. On applique la boucle si on trouve un xxxxxxx.txt)
    do
        if [[ -f $i ]]
        then
            name=$(basename $i) #recupération du nom fichier
            empreinteadresse=$(md5sum $i) #recuperation de l'empreinte fichier
            empreinte=`echo $empreinteadresse | cut -f 1 -d ' '`
            adressefichier=$(readlink -f $name)     
            if [[ -s $cheminbash"/bdd.txt" ]] 
            then
                while read line 
                do
                    adressetest=`echo $line | cut -f 3 -d ' '`
                    firsttest=`echo $line | cut -f 1 -d ' '`
                    if [[ "$firsttest" =~ .txt$ ]]
                    then
                        testempreinte=`echo $line | cut -f 2 -d ' '`
                        cheminacces=`echo $line | cut -f 3 -d ' '`
                        if [[ `grep $empreinte $cheminbash"/bdd.txt"` ]]
                        then
                            test="nonvalide"
                        else
                            test="valide"
                        fi
                        if [[ `grep $cheminacces $cheminbash"/bdd.txt"` ]] && [[ `grep $firsttest $cheminbash"/bdd.txt"` ]]
                        then
                            testsuppression="valide"
                        else
                            testsuppresion="nonvalide"
                        fi
                    fi
                done < $cheminbash"/bdd.txt"
            else
                test="valide"
            fi
        fi
        if [[ $testsuppresion == "valide" ]]
        then
            echo "test"
        fi
        if [[ $test == "valide" ]]
        then
            echo $name $empreinte $adressefichier >> $cheminbash"/bdd.txt" #on mets name et empreinte dans la bdd.txt
            $cheminbash\/projetjohncpp.exe $i $cheminbash"/bdd.txt"
            test="nonvalide"
        fi
    done
     
    echo "base de donnée crée"
    exit
    La ligne if [[ `grep $cheminacces $cheminbash"/bdd.txt"` ]] && [[ `grep $firsttest $cheminbash"/bdd.txt"` ]]
    ne me donne pas le resultat attendu. De plus il me faudrait toujours de quoi intégrer la requete demandé avant. C'est a dire que si je rentre dans le if qui ne marche pas acutellement alors je doit supprimer.(Probleme expliqué avant)

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

    Déjà essaye la commande suivante qui te donnera directement le format des ligne que tu cherches dans ton fichier bdd.txt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -name '*.txt' -printf "%f " -exec md5sum $(readlink -f {} ) \;
    Et si c'est bien le format, un seul grep sur ton fichier bdd.txt, peux te donner la liste des fichiers qui n'ont pas changer, ensuite tu nauras plus qu'a parcourir ton bdd.txt et le traiter en une seule passe.
    Cordialement.

  11. #11
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    J’essaye ça ce soir merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    • Il ne faudrait pas choisir l'espace comme séparateur de champs dans ton fichier bdd.txt car un nom de fichier contenant une espace va faire planter ton programme.
    • Le fichier analysé le plus récent est le plus bas dans le fichier bdd.txt ? Une solution plus propre est d'écrire la date d'analyse comme un champ de la ligne.
    • Comment faire la différence entre une ligne de description de fichier et une ligne de mot ? Le fait que le 3ème champ soit vide ? Une solution propre pourrait être de mettre une balise au début de ligne:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [fichier] texte3.txt 8c132aaec5bf35632b26ff6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
      [mot] attention
      [mot] mou
      [mot] fefp
      [mot] ezfz
      [fichier] texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
      [mot] bash
      [mot] systeme
      [fichier] texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
      [mot] avion
      [mot] manger
      [mot] vomir
    • Pour répondre à la suppression, pourquoi ne pas lire à l'envers ?
      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
      16
      17
      18
      19
      20
      $ tac bdd.txt | awk 'BEGIN{sortie="";} {sortie = ""sortie""((sortie=="")?"":"\n")""$0;} ($3!=""){if (a[$1,$3]==0) {print sortie;} sortie="";a[$1,$3]++;}' |tac
      texte3.txt 8c132aaec5bf35632b26ff6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
      attention
      mou
      fefp
      ezfz
      texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
      avion
      manger
      vomir
      texte4.txt 8c132aaec5bf42jtjtyjyj6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
      atefgfdgd
      ateg
      atehtdh
      atehg
      atekyu
      texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/texte2.txt
      fzefze
      fezfezf
      zkejzo
      Le fichier contenant "bash" et "système" a bien disparu de bdd.txt.

      Explications:
      tac: inverse de cat. Affiche le fichier à l'envers.
      awk: On stocke la sortie. Quand on rencontre une ligne de fichier (champ 3 non vide), on vérifie si le fichier a déjà été vu (tableau associatif a, d'indice champ 1 et champ 3).
      Si oui, on jette.
      Sinon on écrit la sortie stockée.
      tac: Et on retourne le fichier.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  13. #13
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Merci de vos réponse. Par rapport a tes question flodelarab. Premierement j'aimerais bien traité les espaces mais je n'ai aucune idées de comment faire.
    Deuxiemement vu que la bdd doit etre de ce type, je n'ai pas le droit de modifier comment la bdd est. C'est a dire que elle doit etre avec les espace comme séparateur ainsi que les lignes une a une comme precisé avant. Je ne peux donc pas ecrire la date d'analyse. Et je n'ai également pas le droit de mettre une balise en début de ligne.
    flodelarab ta commende marche bien mais de ta commande il faudrait que je puisse remettre chaque ligne bien affiché. Je m'explique. Quand je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if [[ $test == "valide" ]]
                then
                    echo $name $empreinte $adressefichier >> $cheminbash"/bdd.txt" #on mets name et empreinte dans la bdd.txt
                    $cheminbash/projetjohncpp.exe $i $cheminbash"/bdd.txt"
                    areecrire=tac $cheminbash"/bdd.txt" | awk 'BEGIN{sortie="";} {sortie = ""sortie""((sortie=="")?"":"\n")""$0;} ($3!=""){if (a[$1,$3]==0) {print sortie;} sortie="";a[$1,$3]++;}' |tac
                    echo $areecrire > $cheminbash"/bdd.txt" 
                    test="nonvalide"
                fi
    effectivement c niquel en terme de contenu. Mais pour la forme c'est autre chose. Il faudrait que je remette tous a la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [fichier] texte3.txt 8c132aaec5bf35632b26ff6af32672de /mnt/d/travailIUT/projet/dossier1/texte3.txt
    [mot]  attention
    [mot]  mou
    [mot]  fefp
    [mot]  ezfz
    [fichier] texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
    [mot]  bash
    [mot]  systeme
    [fichier] texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt
    [mot]  avion
    [mot]  manger
    [mot]  vomir
    et la on est plus sur du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [fichier] texte2.txt f17d0e5c28cf78a72f1187140738b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt[mot]  bash[mot]  systeme[fichier] texte2.txt jiujfe5c28cf78a72f11456f4fe8b7af /mnt/d/travailIUT/projet/dossier1/texte2.txt[mot]  avion[mot]  manger[mot]  vomir
    Merci beacoup de vos reponse!!

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    et la on est plus sur du
    awk transforme un fichier en un autre fichier.
    Si les fins de lignes ont sauté, c'est parce que tu as voulu mettre tout le fichier dans une variable.
    Il ne faut pas faire cela.

    Ou plutôt: il faut toujours protéger les variables, sauf si tu sais pourquoi.

    Ici, $areecrire n'est pas protégée, et quand tu fais un echo, tu pleurs.

    La bonne syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$areecrire" > "${cheminbash}/bdd.txt"
    Et là, les \n sont conservés.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    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 cimestro Voir le message
    je n'ai toujours pas avancé. Je vous envoie de mon code pour essayé de vous preciser mon probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `find -name "*"".txt"` #boucle for (arborescence fichier. On applique la boucle si on trouve un xxxxxxx.txt)
    do
        if [[ -f $i ]]
    Il vaut mieux écrire:
    ou bien, si tu maîtrises bien les crochets:
    Mais, avec la proposition de find de disedorgue, tu peux carrément supprimer le test explicite en l'ajoutant dans le find:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -type f -name '*.txt' -printf "%f " -exec md5sum $(readlink -f {} ) \;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        then
            name=$(basename $i) #recupération du nom fichier
    Au risque de répéter Flodelarab, il faut toujours protéger les variables, sauf si tu sais pourquoi.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            name=$(basename "$i") #recupération du nom fichier
    Mais, avec bash, autant utiliser le raccourci (plus rapide):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            name=${i##*/} #recupération du nom fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            empreinteadresse=$(md5sum $i) #recuperation de l'empreinte fichier
            empreinte=`echo $empreinteadresse | cut -f 1 -d ' '`
            adressefichier=$(readlink -f $name)     
            if [[ -s $cheminbash"/bdd.txt" ]]
    Idem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            empreinteadresse=$(md5sum "$i") #recuperation de l'empreinte fichier
            empreinte=$(echo "$empreinteadresse" | cut -f 1 -d ' ')
            adressefichier=$(readlink -f "$name")
            if test -s "$cheminbash/bdd.txt"
    Idem pour toutes les autres variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        if [[ `grep $empreinte $cheminbash"/bdd.txt"` ]]
    C'est quoi, ce truc? Tu veux tester si le grep a bien trouvé l'empreinte dans le fichier?
    Si oui, alors tu peux simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        if grep -q "$empreinte" "$cheminbash/bdd.txt"

    La ligne if [[ `grep $cheminacces $cheminbash"/bdd.txt"` ]] && [[ `grep $firsttest $cheminbash"/bdd.txt"` ]] ne me donne pas le resultat attendu.
    Ça ne m'étonne qu'à moitié... ;-)
    Essaie plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if grep -q "$cheminacces" "$cheminbash/bdd.txt" && grep -q "$firsttest" "$cheminbash/bdd.txt"
    De plus il me faudrait toujours de quoi intégrer la requete demandé avant. C'est a dire que si je rentre dans le if qui ne marche pas acutellement alors je doit supprimer.(Probleme expliqué avant)
    pas très clair (pour moi)...

  16. #16
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Deja merci de toute ces reponses. J'ai bien modifié quelque trucs. J'ai bien avancé et j'arrive bientot au bout. Du moins je l’espère. La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ tac bdd.txt | awk 'BEGIN{sortie="";} {sortie = ""sortie""((sortie=="")?"":"\n")""$0;} ($3!=""){if (a[$1,$3]==0) {print sortie;} sortie="";a[$1,$3]++;}' |tac
    marche bien.
    Mais elle ne marche pas tous le temps. A vrai dire vu que je comprends pas le probleme je vais avoir du mal a expliqué. On va avoir des fois lors de la modfication d'un fichier.txt une concaténation de caractere d'autre fois ça ne modifie meme pas le fichier.txt . Ce qui marche c'est quand on a 1 fichier.txt. Mais lorsque qu'il y a 15 fichier.txt et que on commence a en modifié plusieurs alors la c'est la catastrophe

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    for i in find -name "*"".txt"
                do
     
                if test -f "$i"
                    then
     
                    name=${i##*/} #recupération du nom fichier
                     empreinteadresse=$(md5sum "$i") #recuperation de l'empreinte fichier
                    empreinte=echo "$empreinteadresse" | cut -f 1 -d ' '
                    adressefichier=$(readlink -f "$name")
                    if test -s "$cheminbash/bdd.txt"
                        then
     
                        while read line 
                            do
                            adressetest=echo "$line" | cut -f 3 -d ' '
                            firsttest=echo "$line" | cut -f 1 -d ' '
    then
                                testempreinte=echo $line | cut -f 2 -d ' '
                                cheminacces=echo $line | cut -f 3 -d ' '
                                if grep -q "$empreinte" "$cheminbash/bdd.txt"
                                then
                                    test="nonvalide"
                                else
                                echo "$name" "$empreinte" "$adressefichier" >> "$cheminbash/bdd.txt" #on mets name et empreinte dans la bdd.txt
                    "$cheminbash"/projetjohncpp.exe "$i" "$cheminbash/bdd.txt"
    echo "tac "$cheminbash/bdd.txt" | awk 'BEGIN{sortie="";} {sortie = ""sortie""((sortie=="")?"":"\n")""$0;} ($3!=""){if (a[$1,$3]==0) {print sortie;} sortie="";a[$1,$3]++;}' |tac" > "$cheminbash/bdd.txt"
                                fi
     
     
     
     
    fi
                        done < "$cheminbash/bdd.txt"
    else
    echo "$name" "$empreinte" "$adressefichier" >> $cheminbash"/bdd.txt" #on mets name et empreinte dans la bdd.txt
                    "$cheminbash"/projetjohncpp.exe "$i" "$cheminbash/bdd.txt"

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Ton script ne fonctionnera jamais correctement si tu continues dans ce principe, qui est de modifier ton fichier bdd.txt alors que c'est lui que tu lis dans ta boucle.

    Ceci peut donner l'impression de fonctionner sur des petits fichiers à cause de certaines notions de cache mise en œuvre par le lecteur, mais dés que le fichier est plus grand que le cache utilisé par le lecteur, alors celui-ci va charger la suite qui aura potentiellement été modifié par l'écrivain.
    Cordialement.

  18. #18
    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
    Tu peux remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in find -name "*"".txt" # Il manque soit des backquotes, soit un "$("
                do
     
                if test -f "$i"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in $(find -type f -name "*.txt")
                do
    en supprimant l'un des "fi" finaux.

    Mais ceci ne marchera que si aucun nom de fichier ne contient des caractères spéciaux (espace, return, tabulation).

  19. #19
    Membre à l'essai
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Ce soir je me mets a fond sur mon script. Je vais changer de methode du coup

    Vous avez des idées pour traiter si le nom des fichiers comporte des espaces?

  20. #20
    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 cimestro Voir le message
    Vous avez des idées pour traiter si le nom des fichiers comporte des espaces?
    Voici les méthodes que je connais avec find pour traiter les fichiers dont le nom peut comporter des espaces (il y en a probablement d'autres ).

    Les 3 premières nécessitent un 2ème script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    find . -type f -name "*.txt" -exec /chemin/vers/traitement_un_fichier.sh {} \;
    find . -type f -name "*.txt" -exec /chemin/vers/traitement_tous_fichiers.sh {} +
    find . -type f -name "*.txt" -print0 | xargs -0 -- /chemin/vers/traitement_tous_fichiers.sh
    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat traitement_un_fichier.sh
    #!/bin/bash
    file=$1
    echo "Je traite '$file'"
    ...
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat traitement_tous_fichiers.sh
    #!/bin/bash
    while test $# -gt 0; do
        file=$1; shift
        echo "Je traite '$file'"
        ...
    done
    Si les noms de fichiers peuvent comporter des espaces, mais pas de RETURN, on peut aussi faire, dans un seul script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cat mon_scipt.sh
    #!/bin/bash
    fonction_traitement_un_fichier() { file=$1; echo "Je traite '$file'"; }
    find . -type f -name "*.txt" \
      | while read file; do
           fonction_traitement_un_fichier "$file"
        done
    avec les limitations dues à l'exécution d'un sous-shell (impossibilité de modifier des variables globales du script, par exemple).

Discussions similaires

  1. [RegEx] suppression entre 2 recherches
    Par proser dans le forum Langage
    Réponses: 3
    Dernier message: 28/04/2008, 12h05
  2. Suppression entrées sous formulaire
    Par HE dans le forum VBA Access
    Réponses: 1
    Dernier message: 11/02/2008, 15h01
  3. ALEA.ENTRE.BORNE() Comment faire ?
    Par Jimy6000 dans le forum Excel
    Réponses: 28
    Dernier message: 23/01/2008, 07h09
  4. [FORMULE]Recherche valeur approximative entre bornes
    Par philname dans le forum Excel
    Réponses: 2
    Dernier message: 25/05/2007, 15h49
  5. Ajout et Suppression entre deux listBox
    Par sacofan dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/01/2007, 17h02

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