# tri adresse mail selon extension pays



## francois_francois (6 Août 2022)

Bonjour,

J'ai un dossier contenant des fichiers textes contenant des tonnes d'email d'un grand nombre de pays.

Chaque email est sur une ligne. le format ressemble a "bob@provider.xx:diverscaracteres" ( xx peut etre soit fr, be, it, com, etc, etc...)
A NOTER : le separateur en l'adresse mail et le "diverscarateres" peut etre soit ":" ou ";" ou "TAB" ou "ESPACE".

bob@provider.xx:diverscaracteres
paul@provider.xx;diverscaracteres
anne@provider.xx "TABULATION" diverscaracteres
gilles@provider.xx "ESPACE" diverscaracteres

J'ai peu de connaissance avec les commandes du terminal, j'ai recuperé les commandes sed sur le net et adapté comme j'ai pu.


Dans le terminal je fais CD  "mondossierousetrouvelesfichierstextecontenanlesemails"
J'ai bien la commande pour extraire les emails en ".be" du fichier source puis sauvegarder dans un fichier texte.


```
sed -n "/@.*\.be[: ;, ]/p" *.txt > /fichieravecemailBE.txt
```

Comment faire pour extraire les emails, mais sauvegarder les .be dans un fichier BE.TXT, les .fr dans un fichier FR.txt, les .it dans IT.TXT, etc...., en 1 seul passe ?

Actuellement le tri se fait pays par pays, vu la quantité d'emails a traiter, 1 seul pays me prend au moins 5 heures.

la liste des extension a trier  (35 differents)
.at   .ba   .be   .bg   .ca   .ch   .cl   .cz   .dk   .dz   .ee   .edu   .es   .eu   .fi   .fr   .uk   .gr   .hu   .ie   .il   .is   .it   .li   .lu   .mc   .nl   .pl   .pt   .se   .si   .va   .net   .org   .com

Je ne sais meme pas si ma requete est possible.

Merci


----------



## flotow (6 Août 2022)

Lit chaque mail, extrait le XX et déplace le dans un dossier XX (ou ajouté le dans un fichier avec la variable XX)
c’est trié en une seule passe


----------



## ericse (6 Août 2022)

Bonjour,
C'est un peu difficile de t'aider tout en se demandant si cette base d'email est bien légitime


----------



## francois_francois (6 Août 2022)

@ericse,

Je recolte des listes emails public sur net via un logiciel dedié, c'est illegal ?


----------



## francois_francois (6 Août 2022)

flotow a dit:


> Lit chaque mail, extrait le XX et déplace le dans un dossier XX (ou ajouté le dans un fichier avec la variable XX)
> c’est trié en une seule passe


oui c'est ce que je veux faire.

le probleme reste quelle est la syntaxe pour faire ca.

Y' a surement une petite astuce de code a ajouter. Je peux pas inviter ce que je connais pas


----------



## ericse (6 Août 2022)

francois_francois a dit:


> Je recolte des listes emails public sur net via un logiciel dedié, c'est illegal ?


En général oui. Pour les emails européen, leur simple conservation tombe sous le coup du GDPR et tu dois obtenir le consentement explicite du propriétaire. Pour la plupart des autres pays c'est l'utilisation pour envoyer des mails non sollicités qui est interdite.


----------



## francois_francois (6 Août 2022)

Je recolte les mails en vue de statistiques. 
Pas d'envoi a quiconque, c'est pour ce que je dois les trier, par pays dans des fichiers texte.


----------



## ericse (6 Août 2022)

francois_francois a dit:


> Je recolte les mails en vue de statistiques.
> Pas d'envoi a quiconque, c'est pour ce que je dois les trier, par pays dans des fichiers texte.


Pour les emails Européen il faut les anonymiser avant de les stocker, tu n'as qu'à faire un hash de la partie avant l'@

Bon je dis ça, mais en même temps si tu avais d'autres buts tu n'en parlerais pas


----------



## francois_francois (6 Août 2022)

Ces statitisques sont faites dans le cadre privé, sans divulgation, pret, vente, partage, donation, utilisation, contacte.
C'est ce que l'on appelle du "OnlyForMyEyes".

Classer les mails par pays dans un fichier texte dédié pour chacun, permet BEAUCOUP plus facilement de retirer les doublons, les trier par ordre croissant, decroissant, etc.... (meme si l'on peut faire ses operations en ligne de commande). Je prefere voir le resultat directement dans BBEDIT.

Autre avantage, ouvrir des fichiers texte, de petites tailles est plus facile qu'un gros fichier.


----------



## jcezanna54 (6 Août 2022)

Bonjour,
Dans un fichier "t.pl" que l'on met dans le même répertoire que celui où se trouve le fichier avec les mails :


> #!/usr/bin/perl
> while(my $lig = <>) {
> chomp($lig) ;
> 
> ...


Au niveau du split, il y a un espace et une tabulation
Ensuite faire :


> chmod a+x t.pl


puis, 


> cat fichierDesMails | ./t.pl


on doit retrouver les mail de .fr dans fr.txt, .com dans com.txt, etc...
Sinon, merci de m'avoir rappelé ma jeunesse ....


----------



## francois_francois (7 Août 2022)

@jcezanna54

Merci de ton support,

C'est bien plus compliqué que ma ligne sed. Je n'aurais jamais trouvé.

Je vais tester, je reviens vers toi pour t'informer de ce que ca donne.

Merci

CDLT,

---------------
MAJ :

Je viens de tester.
Ton script créé un fichier avec le nom de domaine (hotmail, gmail, yahoo, etc...) puis insere les mails gmail dans le fichier gmail.txt, yahoo dans yahoo.txt , etc...

Je souhaite plus simple que ca, que les mails avec extension @tartanpion.fr (gmail.fr, yahoo.fr, XXXX.fr, etc... soient regroupé dans un fichier texte .FR

Je met 2 photos ecrans pour bien expliquer mon propos.

merci


----------



## jcezanna54 (7 Août 2022)

Bonjour,

J'ai créé mon script et je l'ai testé à partir des 4 lignes d'exemples données dans ton premier messages en remplaçant les xx par des fr, at et autres com pour créer des fichiers fr.txt, at.txt



> $ cat data ; ls *.txt
> bob@provider.fr:diverscaracteres
> paul@provider.be;diverscaracteres
> anne@provider.at    diverscaracteres
> ...





> $ for f in *.txt
> 
> 
> > do
> ...


Apparemment, il y a une incompréhension, soit dans la description des données en entrée, soit dans le résultat voulu en sortiece que semble indiquer ta deuxième image puisque le nom des fichiers semble contenir plus de caractères que le simple nom de la localisation, ou sans doute les 2.
cette même 2ème image est contraire à ce que tu demandes dans ton premier message :
_*Comment faire pour extraire les emails, mais sauvegarder les .be dans un fichier BE.TXT, les .fr dans un fichier FR.txt, les .it dans IT.TXT, etc...., en 1 seul passe ?*_
Il faudrait donc que tu réfléchisses :
1) à bien décrire tes entrées (qui semblent donc différentes de l'exemple donné puisque produisant une sortie différente de celle que j'observe)
2) à bien décrire ce que tu veux en sortie
Cordialement,


----------



## francois_francois (7 Août 2022)

@jcezanna54

Merci de ton retour,

Je recommence une explication plus détaillée de ma requête, qui etait confuse.

1) J'ai un dossier qui contient plusieurs fichiers texte de très grande taille.
2) chaque fichier texte de ce dossier, contient des dizaines de milliers de lignes
3) chaque ligne contient une adresse mail au format suivant login@provider.extension:autretexte
=> entre l'extension et autretexte,   il y a soit ":" "," ";" "TAB" "ESPACE"

4) l'extension des mails est l'une de ceux de dessous
.at  .ba  .be  .bg  .ca  .ch  .cl  .cz  .dk  .dz  .ee  .edu  .es  .eu  .fi  .fr  .uk  .gr  .hu  .ie  .il  .is  .it  .li  .lu  .mc  .nl  .pl  .pt  .se  .si  .va  .net  .org  .com

Pour l'exemple, ci dessous un court extrait d'une liste de mails (ou certaines informations ont été remplacées par "test" "chance", afin de rester anonyme)
Pour faire simple les extensions des mails sont limités .li, .dz, .fi, .va, .mc, .lu, .is, .ee .si

https://anonfiles.com/maeeE529ye/listemails_txt

5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt avec extension ".li" devront se trouver dans un fichier texte LI_pays.txt
5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt  avec extension ".dz" devront se trouver dans un fichier texte DZ_pays.txt
5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt  avec extension ".fi" devront se trouver dans un fichier texte FI_pays.txt
ainsi de suite pour toutes les extensions citées au N°4

CDLT,


----------



## nicomarcos (7 Août 2022)

francois_francois a dit:


> C'est ce que l'on appelle du "OnlyForMyEyes".


_Mais ça te sert à quoi ? _


----------



## francois_francois (7 Août 2022)

@nicomarcos
Ce post est assez complexe, contacte moi plutot en privé. merci


----------



## zeltron54 (7 Août 2022)

Bonjour,
@francois_francois

Je t'ai écrit un petit applescript qui devrait faire ce que tu demandes.
c'est plus long que les scripts dans le terminal, mais bon...
pour utiliser ce script:
Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton en haut à gauche “Exécuter”

Le script te demande de choisir le fichier "listemail.txt" à traiter, puis il te demande de choisir un dossier destiné à récupérer les fichiers textes générés(un par pays) qui seront nommés avec (l'extension) du pays.txt.

Il te met un message lorsqu'il a terminé.

Dis moi si cela te convient ou s'il faut modifier quelque chose.


```
property lepays : ""
property laligne : ""
property lechemin : ""

set monFichier to choose file with prompt "Sélectionnez le fichier listemail. txt à traiter"
set lechemin to choose folder with prompt "Sélectionnez le dossier pour la réception des fichiers texte par pays"

open for access monFichier -- ouvre ce fichier en lecture
set vartoto to read monFichier -- lit le fichier et le met dans la variable vartoto
close access monFichier -- ferme le fichier

set separ to {":", ";", ",", " ", "    "}
set nbligne to count of paragraph of vartoto

repeat with j from 1 to nbligne
    set laligne to paragraph j of vartoto as string
    set AppleScript's text item delimiters to "@"
    set suite to text item 2 of laligne as string -- récupère la ligne 1
    set AppleScript's text item delimiters to ""
   
    set suiteadresse to ""
    set lecar to 1
    repeat
        if item lecar of suite is in separ then
            set suiteadresse to suiteadresse as string
            set lepays to text items (lepoint + 1) thru (lecar - 1) of suiteadresse
            set lepays to lepays as string
            my ecritligne()
            exit repeat
        else
            set suiteadresse to suiteadresse & item lecar of suite
            if item lecar of suite is "." then set lepoint to lecar
            set lecar to lecar + 1
        end if
    end repeat
end repeat

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on ecritligne()
    set ecritdans to lechemin as text
    set ecritdans to ecritdans & lepays & ".txt"
    set lelog to open for access (ecritdans) as text with write permission
    write laligne & return to lelog starting at eof
    close access lelog
end ecritligne
```


----------



## jcezanna54 (7 Août 2022)

Bonsoir,

Avec les explications nécessaires, c'est plus clair !
Pour traiter un fichier de mails en une seule passe :



> #!/usr/bin/perl
> 
> # liste des pays à compléter
> %pays = (
> ...


le fichier listemails.txt étant renommé en listemails.data pour des raisons pratiques,
avec la commande


> $ cat listemails.data | ./t.pl


Sinon, pour traiter tous les fichiers en une seule passe on peut faire "cat _mails | ./t.pl" en utilisant la génération de noms de fichier avec la caractère "_" ou une combinaison...
Mais pour ce fichier, on obtient donc :


> $ ls
> dz_Algerie.txt       il_Israel.txt        listemails.data      si_Slovenie.txt
> ee_Estonie.txt       is_Islande.txt       lu_Luxembourg.txt    t.pl
> fi_Finlande.txt      li_Liechtenstein.txt mc_Monaco.txt        va_Vatican.txt
> ...


pour compléter la liste des pays, voir : liste des code internet

Bonne chance

NB: pour me simplifier la vie, j'ai enlevé les accents dans les noms de pays.


----------



## francois_francois (8 Août 2022)

@jcezanna54​
Merci d'avoir pris le temps de modifier le script.

J'essai dès que possible, je reviens pour te donner le résultat.

Encore merci,

CDLT,


----------



## francois_francois (8 Août 2022)

zeltron54 a dit:


> Bonjour,
> @francois_francois
> 
> Je t'ai écrit un petit applescript qui devrait faire ce que tu demandes.
> ...


Bonjour Zeltron54

Merci de me proposer ton aide.
Je vais tester egalement ton travail.

C'esst d'autant plus intéréssant que l'on va pouvoir comparer la vitesse d'execution de ton script et celui de jcezanna54.

Pour un resultat significatif du temps d'execution, je vais traiter un fichier texte de 2 gigas.

Je reviens vers toi, après essai.

Merci

CDLT


----------



## jcezanna54 (8 Août 2022)

bonjour,

Je n'ai aucune compétence en applescript, mais il me semble :
1) que le cas du nom du pays en clair n'est pas traité
2) que le informations essentielles du traitement sont demandées en interactif, cee qui rend difficile l'automatisation pour une comparaison des temps d'exécution
3) que le fichier est lu en mémoire, ce qui est aussi possible en perl mais que je n'ai pas fait par souci de simplification
4) qu'il n'est pas possible de traiter l'ensemble des fichiers de données en 1 seule passe

Enfin, la commande "times" peut t'aider dans tes comparaisons

dans l'attente de tes résultats


----------



## zeltron54 (8 Août 2022)

Bonjour,
@jcezanna54 

Je ne connait pas le langage perl ! 
effectivement je n'ai pas traité le nom du pays en clair.
J'avais fait ce script, avant que tu ne modifies le tien, qui je n'en doute pas sera beaucoup plus rapide, donc le mien n'a plus lieu d'être !
Francois_francois va faire ces essais et verra bien...

En tout cas merci pour ton retour.


----------



## francois_francois (8 Août 2022)

@zeltron54

Hummm, Houston nous avons un problème


----------



## zeltron54 (8 Août 2022)

Avec ces seules infos, il m'est difficile de trouvé l'erreur !
A priori il ne trouve pas le fichier

```
SSD525:Users:xxx:Desktop:TEST2:241OMEGAS_UNIQ_NO_RU.txt
```

Que représente ce fichier, une liste de mails ?

Edit: j'ai fait un essai sur ton fichier test, pas de problème


----------



## francois_francois (8 Août 2022)

@jcezanna54

J' ai lancé le t.pl a 9H00, je suis revenu chez moi a 15H00, tout semble traité (fichier de 2 gigas).
Ca fait le boulot.

Peut être une chose a revoir,

Serait-il possible d'exclure du traitement les mails qui ont l'un ou l'autre (ou les 2) criteres suivants :

• les emails malformés (dont il manque une partie pour former une adresse mail valide)
• les emails dont l'extension ne fait pas partie de la liste des extensions souhaitées ci dessous
(.at   .ba   .be   .bg   .ca   .ch   .cl   .cz   .dk   .dz   .ee   .edu   .es   .eu   .fi   .fr   .uk   .gr   .hu   .ie   .il   .is   .it   .li   .lu   .mc   .nl   .pl   .pt   .se   .si   .va   .net   .org   .com )

==========================================
exemple d'emails qui ont été sauvegardés dans un fichier texte.

test@yahoo.hannahmontanacom:chance       <= il manque le "." avant com
test@yahoo.com.hik:chance       <= ".hik" n'est pas une extension de la liste des extensions.
test@msa.hinenet:chance        <= ".hinenet" n'est pas une extension de la liste des extensions.
test@gmail.com.hebert:chance       <= apres ".com", ce n'est ni "," ou ";" ou "espace" ou "TAB"
==========================================

Pour le test, nous avons choisi d'extraire 10 pays, le script l'a bien fait, mais il a aussi extrait les mails mals formés ou l'extension n'es pas dans la liste des extensions rexcherchés.

Du coup, au lieu d'avoir seulement les 10 fichiers texte avec les extensions (dz_Algerie.txt, lu_Luxembourg.txt, il_Israel.txt, etc...) j'ai 6520 fichiers. (voir photo écran)

Si tu souhaites modifier le script (qui sera de fait optimisé, puisque ne traitant que les bonnes extensions, je relancerai un test chronometré cette fois).

Merci des efforts consentis.

CDLT,


----------



## francois_francois (8 Août 2022)

zeltron54 a dit:


> Avec ces seules infos, il m'est difficile de trouvé l'erreur !
> A priori il ne trouve pas le fichier
> 
> ```
> ...


oui, j'ai reuni plusieurs fichiers texte. J'avais deja commencé a retirer les mais .ru, .cn, les mails de spammeurs bien connus, etc.., et trié les doublons.
Vu la taille du fichier texte, sous BBedit ca pas evident, c'est lent, ca gel. Je passe par le terminal, c'est assez rapide.

Zeltron, ton script est capable de lire un fichier superieur a 2 gigas ??????


----------



## zeltron54 (8 Août 2022)

Ok !
Comme je l'avais dit l'applescript est beaucoup plus lent que le perl !
Donc je laisse @jcezanna54 te faire le boulot !  Bon courage


----------



## francois_francois (8 Août 2022)

Je ne peux pas dire si c'est lent ou pas, ca n'a pas démarré.


----------



## zeltron54 (8 Août 2022)

En attendant que @jcezanna54 te modifie son script, j'ai modifié le mien.
La seule chose que je n'ai pas traité est le pays en clair.

Peux-tu faire un essai (déjà sur un petit fichier pour test)


```
property lepays : ""
property laligne : ""
property lechemin : ""

set monFichier to choose file with prompt "Sélectionnez le fichier listemail. txt à traiter"
set lechemin to choose folder with prompt "Sélectionnez le dossier pour la réception des fichiers texte par pays"
set monFichier to POSIX path of monFichier

set separ to {":", ";", ",", " ", "    "}
set lextension to {"at", "ba", "be", "bg", "ca", "ch", "cl", "cz", "dk", "dz", "ee", "edu", "es", "eu", "fi", "fr", "uk", "gr", "hu", "ie", "il", "is", "it", "li", "lu", "mc", "nl", "pl", "pt", "se", "si", "va", "net", "org", "com"}
tell application "Finder"
    set nb to do shell script "wc -l < " & monFichier
    set ligne to 1
    repeat
        set commande to "sed -n '" & ligne & "p' " & monFichier
        set laligne to do shell script commande
        
        
        set AppleScript's text item delimiters to "@"
        set suite to text item 2 of laligne -- récupère la ligne 1
        set AppleScript's text item delimiters to ""
        
        set suiteadresse to ""
        set lecar to 1
        repeat
            if item lecar of suite is in separ then
                set suiteadresse to suiteadresse as string
                set lepays to text items (lepoint + 1) thru (lecar - 1) of suiteadresse
                set lepays to lepays as string
                if lepays is in lextension then my ecritligne()
                exit repeat
            else
                set suiteadresse to suiteadresse & item lecar of suite
                if item lecar of suite is "." then set lepoint to lecar
                set lecar to lecar + 1
            end if
        end repeat
        
        set ligne to ligne + 1
        if ligne > nb then exit repeat
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on ecritligne()
    set ecritdans to lechemin as text
    set ecritdans to ecritdans & lepays & ".txt"
    set lelog to open for access (ecritdans) as text with write permission
    write laligne & return to lelog starting at eof
    close access lelog
end ecritligne
```


----------



## zeltron54 (9 Août 2022)

Bonjour,
j'avais oublié de traiter 2 cas d'erreur
1 - pas de signe "@" dans la ligne
2 - pas de "." entre "@" et le séparateur
c'est fait  ! 

Pour mettre la pays en clair, je pense qu'il sera plus simple de renommer les 35 fichiers en fin de traitement.
Le traitement d'un deuxième fichier .txt en choisissant le même dossier de destination ajoute les nouvelles lignes aux fichiers existant, ce qui devrait permettre de traiter des fichiers plus petits en les scindant.


```
property lepays : ""
property laligne : ""
property lechemin : ""

set monFichier to choose file with prompt "Sélectionnez le fichier listemail. txt à traiter"
set lechemin to choose folder with prompt "Sélectionnez le dossier pour la réception des fichiers texte par pays"
set monFichier to POSIX path of monFichier

set separ to {":", ";", ",", " ", "    "}
set lextension to {"at", "ba", "be", "bg", "ca", "ch", "cl", "cz", "dk", "dz", "ee", "edu", "es", "eu", "fi", "fr", "uk", "gr", "hu", "ie", "il", "is", "it", "li", "lu", "mc", "nl", "pl", "pt", "se", "si", "va", "net", "org", "com"}
tell application "Finder"
    set nb to do shell script "wc -l < " & monFichier
    set ligne to 1
    repeat
        set commande to "sed -n '" & ligne & "p' " & monFichier
        set laligne to do shell script commande
        
        try
            set AppleScript's text item delimiters to "@"
            set suite to text item 2 of laligne -- récupère la ligne 1
            set AppleScript's text item delimiters to ""
            
            set suiteadresse to ""
            set lecar to 1
            
            repeat
                if item lecar of suite is in separ then
                    set suiteadresse to suiteadresse as string
                    set lepays to text items (lepoint + 1) thru (lecar - 1) of suiteadresse
                    set lepays to lepays as string
                    if lepays is in lextension then my ecritligne()
                    exit repeat
                else
                    set suiteadresse to suiteadresse & item lecar of suite
                    if item lecar of suite is "." then set lepoint to lecar
                    set lecar to lecar + 1
                end if
            end repeat
        end try
        set ligne to ligne + 1
        if ligne > nb then exit repeat
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on ecritligne()
    set ecritdans to lechemin as text
    set ecritdans to ecritdans & lepays & ".txt"
    set lelog to open for access (ecritdans) as text with write permission
    write laligne & return to lelog starting at eof
    close access lelog
end ecritligne
```


----------



## francois_francois (9 Août 2022)

Merci de la retouche de ton travail.

Je vais faire un 1er test sur un petit fichier de 123 MEGAS, puis sur le 2 GIGAS.

Merci


MAJ :

_*1er essai *_
En 5 minutes, voici la taille des fichiers com.txt, cz.txt, es.txt, net.txt, se.txt, uk.txt, fr.txt, il.txt, que le script a trouvé sur le fichier de 123 MEGAS



soit
342 .com
1 .cz
1 .es
3 .fr
1 .il
12 .net
1 .se
1 .uk





_*2e essai*
Tout pareil, sauf le fichier texte qui est de 2 GIGAS.
ca fonctionne aussi, il crée assez rapidement les fichiers suivants => com.txt, net.txt, pl.txt, et ca continue a fonctionner._

En 5 minutes, voici la taille des fichiers com.txt, net.txt, pl.txt que le script a trouvé sur le fichier de 2 GIGAS


Soit :
41 .com
6 .net
1 .pl

il me semble qu'il trouve bien plus de mails a la seconde avec un fichier de 100 megas, qu'avec le 2 gigas.


En comparaison, le script de @jcezanna54 (qui n'utilise pas le meme langage) travaille plus rapidement (bien qu'il traite aussi des mails parasites).






En 3 heures :
1,8 Giga de .com
124 Megas de .net
7,4 Megas de .fr
etc...


----------



## zeltron54 (9 Août 2022)

C'est certain que le langage "perl" est beaucoup plus rapide que l'applescript.

C'est pour ça que lors de mon premier script je chargeais la totalité du fichier texte en mémoire ram, pour gagner du temps (plus d'accès disque), mais ça n'a pas fonctionné !

Le script analyse toutes les lignes, une par une , en fonction des lignes valides trouvées ce sera plus ou moins long...

Bon si cela fonctionne c'est le principal !...


----------



## zeltron54 (9 Août 2022)

J'ai pas précisé, à la fin du traitement le script affiche un message de fin "waouou ... Ca y est c'est fait !", si ce message n'est pas validé dans les 3 minutes alors une erreur de script est affichée "Erreur dans Finder : Délai dépassé pour un AppleEvent." cela n'a aucune conséquence.


----------



## francois_francois (9 Août 2022)

perfectionniste


----------



## francois_francois (9 Août 2022)

@jcezanna54

Si tu veux faire la modification de ton script, tout est indiqué ici :
https://forums.macg.co/threads/tri-adresse-mail-selon-extension-pays.1376005/page-2#post-14275655

Autre chose que je viens de voir, les mails qui ne possede pas @ dans l'adresse sont traités comme mails valides.
j'ai volontairement ajouté un mail avec mauvaise syntaxe, le script l'a reconnu comme valide et ajouté dans la liste des .com





La j'ai testé ton script sur un fichier de 2 GIGAS, tous se passe ok (sous reserve de faire la modification ci-dessus).
Ton script fonctionnera t-il avec un dossier contenant 15 fichiers texte d'une taille de 11 gigas jusqu'a 135 gigas ?

Merci


----------



## jcezanna54 (9 Août 2022)

Bonjour,

Mon script fonctionnera avec autant de données que tu veux puisqu'il lit les fichiers ligne à ligne. Ce sera juste une question de temps.
En supposant que tes 15 fichiers aient une extension "data" pour ne pas faire de confusion avec les "txt" qui sont des résultats, tu pourras essayer :


> for f in *.data
> do
> echo "traitement de $f"
> cat $f | ./t.pl
> done


Et puis, comme je n'ai aucune idée du temps de traitement, tu peux lancer un film ....


J'ai modifié ton fichier de données test en y ajoutant les lignes :


> test@elisanet.fi:chance
> 
> test@dsl.bid1:chance
> test@elisanet.bid1:chance
> ...


en y ajoutant des lignes vides pour faire bon poids
le script modifié est le suivant :


> #!/usr/bin/perl
> 
> # liste des pays à compléter
> %pays = (
> ...


les modifications sont simples :
1) ne pas traiter si pas de "@"
2) ne pas traiter si pas dans dans la liste des pays
S'il y a encore d'autres sujets à ne pas traiter, ce serait bien d'en avoir une liste exhaustive, en bref de faire ce que les informaticiens appellent une "analyse" du problème.
Sinon, un expert en perl pourrait aisément trouver des moyens d'améliorer les performances de ce script.
Je l'ai laissé volontairement "simple" pour être lisible et compréhensible par d'autres.


----------



## francois_francois (9 Août 2022)

@jcezanna54​
Merci. J'essai des que possible.

J'ai pas compris ou je dois mettre ces lignes de code ?


> for f in *.data
> do
> echo "traitement de $f"
> cat $f | ./t.pl
> done


----------



## francois_francois (10 Août 2022)

@jcezanna54​Actuellement, je test ta derniere version du script.

Ca semble trè bien, je joint une photo ecran, des resultats en cours.
J'indiquerai le temps total d'execution après.


----------



## jcezanna54 (10 Août 2022)

francois_francois a dit:


> @jcezanna54​
> Merci. J'essai des que possible.
> 
> J'ai pas compris ou je dois mettre ces lignes de code ?


soit tu les met dans un fichier t.sh et ensuite dans le terminal tu tapes "sh t.sh" soit tu les tapes directement dans le terminal si tu es certain de ne pas faire d'erreur de frappe...
C'est uniquement pour traiter l'ensemble des fichiers en une seule passe si tu les a renommé avec une extension ".data"


----------



## francois_francois (10 Août 2022)

jcezanna54 a dit:


> soit tu les met dans un fichier t.sh et ensuite dans le terminal tu tapes "sh t.sh" soit tu les tapes directement dans le terminal si tu es certain de ne pas faire d'erreur de frappe...
> C'est uniquement pour traiter l'ensemble des fichiers en une seule passe si tu les a renommé avec une extension ".data"


pour tester j'ai mis 2 fichiers texte (.txt) avec des mails dans un dossier

puis fais


> cd le_dossier_ou_se_trouve_les_fichiers_texte_avec_mails
> cat * | /Users/xxx/Desktop/tversion2.pl


les mails des 2 fichiers ont été extraits et placés dans des fichiers au nom des pays

Est ce que ca pose un probleme d utiliser  "cat * | /Users/xxx/Desktop/tversion2.pl" au lieu de ton "sh t.sh" ?

merci


----------



## francois_francois (10 Août 2022)

Resultats du temps d'execution extraction des mails d'un fichier de 2 GIGAS

----------------------------------------------------
DEBUT extraction des mails a : Wed Aug 10 15:23:17 2022
----------------------------------------------------
----------------------------------------------------
FIN extraction des mails a : Wed Aug 10 17:54:44 2022
----------------------------------------------------


----------



## jcezanna54 (11 Août 2022)

> Est ce que ca pose un probleme d utiliser  "cat * | /Users/xxx/Desktop/tversion2.pl" au lieu de ton "sh t.sh" ?


Non, s'il n'y a que les fichiers à traiter dans le répertoire courant.
Sinon, il faut trouver un moyen de faire la distinction entre les fichiers en entrée et les autres. Comme j'avais tout dans un même répertoire, je renommais le fichier en entrée avec un extension ".data" qui le distinguait des fichiers résultats (".txt"), de mon script (".pl"). En cas d'erreur de mon script, je pouvais faire "rm *.txt" avant de recommencer.

Pour les performances, tu as donc environ 02:30 pour 2 gigas, soit 01:15 par giga.
La commande "time" te donne des informations plus précises :


> $ cat listemails.data | time ./t.pl
> 0,05 real         0,00 user         0,03 sys


real est le temps elapse pour l'utilisateur
user est le temps CPU en mode user
sys est le temps CPU en mode système (temps d'exécution des appels systèmes)

Bonne chance et prépare toi 2 ou 3 thermos de café ...


----------



## francois_francois (11 Août 2022)

Un special Merci a jcezanna54    et merci a Zeltron54    pour leur assistance.


----------



## francois_francois (30 Août 2022)

Bonjour

Un petit souci avec le terminal.
le script "tversion2.pl" donné par jcezanna54 fonctionnait a merveille.

J'ai utilisé une application "cool menu", qui permet de faire des operations d'entretien du systeme. J'ai vidé le cache de "je ne souviens plus de quoi!"

Depuis le script se lance bien, mais plus rien ne se passe (aucun pays extrait).
les pays ne sont plus extrait du fichier .txt

J'ai redemarré le mac, zapper la PRAM. Toujours pareil.

Une idée ????

Merci


----------



## baron (30 Août 2022)

francois_francois a dit:


> Une idée ????


Retour à une version antérieure de ton disque grâce à une sauvegarde ?


----------



## francois_francois (30 Août 2022)

@baron,

merci de ta réponse,

Mis a part ce script qui ne marche plus, tout fonctionne bien pourtant.
Attendons de voir si quelqu'un connait une solution.

merci


----------



## zeltron54 (30 Août 2022)

Bonjour,
@francois_francois

Afin de voir d'où peut provenir le problème je ferais quelques tests

Essai d'une commande ordinaire dans le terminal
Essai d'un script shell
Essai d'un autre script perl
Essai du script dans une autre session
Et essayer tous ces même tests dans une autre session


----------



## love_leeloo (30 Août 2022)

francois_francois a dit:


> J'ai utilisé une application "cool menu", qui permet de faire des operations d'entretien du systeme. J'ai vidé le cache de "je ne souviens plus de quoi!"


quelles opérations ont été faites et comment ?
tu maitrises ce logiciel ?
tu avais des soucis sur ta machine ?


----------



## francois_francois (30 Août 2022)

@love_leeloo 
c'est un meu deroulant tu selectionne les actions a faire. J'ai fais :

free disk pace / Applications caches
free disk pace / Applications logs
free disk pace / Partial download

afin de recupérer de la place que mon SSD.


----------



## francois_francois (30 Août 2022)

zeltron54 a dit:


> Bonjour,
> @francois_francois
> 
> Afin de voir d'où peut provenir le problème je ferais quelques tests
> ...


Bonjour

je viens de reinstaller Perl.
Tous fonctionne bien pour l'installation


----------



## francois_francois (30 Août 2022)

@zeltron54
je viens d'essayer ce script ca marche nickel



> #!/bin/bash
> for file in *.txt
> do
> echo "Traitement de $file ..."
> ...




J'ai essayé aussi ce script perl qui fonctionne bien aussi.


> #!/usr/bin/perl
> # Affiche une table de multiplication.
> use strict;
> use warnings;
> ...


----------



## francois_francois (31 Août 2022)

Y'a pas eu une mise a jour de l'OS qui pourrait en etre la cause ?

Si quelqu'un veut bien tester sur sa machine (avec le dernier OS a jour), si le script fonctionne ou pas.
https://anonfiles.com/8fM7e76cy5/TEST_zip

1) faire CD le dossier ou se trouve le fichier TEST.txt
2) glisser le script dans le terminal, puis return

Merci


----------



## zeltron54 (31 Août 2022)

Bonjour,

Ton script fonctionne ! mais il faut l'appeler en luis donnant le nom du fichier à traiter !

1) faire CD le dossier ou se trouve le fichier
2) cat ./testemail.txt | ./tversion2.pl

Les fichiers résultats sont dans le même dossier que le fichier original.
Afin d'éviter une confusion, il serait souhaitable de renommer le fichier original à traiter en ".data" au lieu de ".txt" qui est aussi l'extension des fichiers résultats.


----------



## francois_francois (31 Août 2022)

@zeltron54 

Je viens de verifier, effectivement, l'erreur vient bien de moi. 






Merci de ton aide.


----------



## zeltron54 (3 Septembre 2022)

Bonjour,

Si cela peut t'aider, je peux te créer un petit applescript, à enregistrer comme application, qui te demande de sélectionner le fichier texte à traiter, puis de sélectionner le script perl, puis qui lance le script perl en créant un dossier sur le bureau pour recevoir le résultat du traitement. ?


----------



## francois_francois (11 Septembre 2022)

Bonjour

Pour ceux qui ont lu mes précédents messages, je continue de trier des lignes de données dans des fichiers texte.

En piochant des lignes de codes a droite et gauche, j'ai reussi a faire ce script mais ca coince a la ligne 11.
Une histoire de recuperation d'une valeur d'une commande, bref....

Je tatonne depuis un moment, mais je trouve pas la bonne syntaxe.

J'ai un dossier ou se trouve 1 ou plusieurs fichiers .txt dans un dossier (chaque fichier possède obligatoirement "¨_Pays_" dans son nom)
Je souhaite que si le script detecte au moins 2 fichiers .txt ceux-ci soient concatené avec le nom final.txt, sinon, on passe a l'etape suivante.

Une aide serait la bienvenue. Merci



> #!/bin/bash
> 
> echo "***********************************************"
> echo "nombre de fichiers texte dans le dossier..."
> ...


----------



## Locke (11 Septembre 2022)

@francois_francois
Pour une meilleure compréhension, mieux vaut continuer dans ton message de base, je déménage ta nouvelle demande ici.


----------



## zeltron54 (11 Septembre 2022)

Bonjour,

Ta ligne 11  
if $variable > 1
devrait être 
if test $variable -gt 1


----------



## francois_francois (11 Septembre 2022)

@zeltron54

Ca fonctionne bien.

Encore une petite chose, comment retirer le "point d'interrogation" (retour, j'imagine) a la fin de certaines lignes ?
Sinon la suppression des doubles ne fonctionne pas correctement.

merci


----------



## francois_francois (11 Septembre 2022)

J'ai fait ca, ca semble focntionner mais, est ce la bonne maniere de faire ?


----------



## zeltron54 (11 Septembre 2022)

N'ayant pas ton texte et ne sachant pas exactement ce que tu veux obtenir, il est difficile de te dire ...

sed -e s/¿//g

Signifie substitue le caractère ¿ par (rien) sur toute la ligne  ...
donc supprime tous les caractères ¿ sur toute la ligne traitée ...


----------



## francois_francois (11 Septembre 2022)

J'aurais préféré que ca supprime seulement les 'point d"interrogation' en fin de ligne (voir exemple copie ecran ci dessus 'password¿"


----------



## zeltron54 (11 Septembre 2022)

La commande
sed -i '' -e 's/¿$//' tonfichier

devrait effacer les ¿ qui sont en fin de ligne
-i un espace suivi de deux '  ceci sur mac pour travailler directement dans le fichier.
Fait quelques tests ...   avant d'appliquer définitif !


----------



## francois_francois (11 Septembre 2022)

Je viens de tester, ca ne fonctionne pas tres bien.
Les "¿" sont toujours a la fin des lignes

J'ai modifié la ligne par
  sed -i -e "s/¿$//g" "$file"
ca  fonctionne, ca ne retire que le ¿ de la fin de ligne (et laisse ceux eventuellement ailleurs).

Merci de ton aide zeltron54


----------



## zeltron54 (11 Septembre 2022)

Curieux chez moi cela fonctionne que ce soit des " ou des ' pas de différence...
Afin si tout fonctionne


----------



## francois_francois (12 Septembre 2022)

original
sed -i '' -e 's/¿$//'

modification
 sed -i -e "s/¿$//g" "$file"

apres les deux slashes, un 'g' a été ajouté aussi


----------



## zeltron54 (12 Septembre 2022)

Bonjour,

Je viens de retester !
Les 2 formules me donnent exactement le même résultat.

Le but étant que cela fasse le job , alors qu'importe ...


----------



## francois_francois (16 Septembre 2022)

Bonjour

Le script qui trie, retire les doublons etc... utilise le disque demarrage pour stocker des fichiers temporaires.
Peut on lui indiquer d'utiliser un disque specifique pour ecrire les fichiers temporaires ? (sinon ca sature mon disque de boot, un SSD de 525 Gigas)

Merci


----------



## zeltron54 (17 Septembre 2022)

Bonjour,

Je ne crois pas trop aux fichiers temporaires (mais je n'ai pas ton script ! ).
Je pencherai plus vers un problème de duplication des fichiers lors du traitement pour enlever les ¿ .

En effet ta formule sed -i -e "s/¿$//g" "$file"  duplique le fichier en le renommant xxxx.txt-e, alors que la formule sed -i '' -e 's/¿$//'  travaille sur le fichier d'origine (comme déjà dit) sans créer de double.
A vérifier


----------



## francois_francois (18 Septembre 2022)

ok merci


----------



## francois_francois (18 Septembre 2022)

@zeltron54 

selon https://www.ionos.fr/digitalguide/serveur/configuration/commande-sed-de-linux/


-iIndique la création d’un fichier temporaire destiné à remplacer le fichier d’origine.

il y a donc bien creation d'un (ou des) fichiers temporaires dans ta commande sed -i '' -e 's/¿$//'

C'est bien ca ?


----------



## zeltron54 (18 Septembre 2022)

Ceci est vrai sous unix et linux, d'ailleur sous linux il n'y a pas les 2 ' qui suivent le -i
les 2 ' qui suivent le -i est spécifique au mac et permet justement de ne pas créer les fichiers, qui d' ailleurs sur mac ne sont pas temporaires, mais dupliqués.

Fais quelques test avec un fichier texte et passe successivement les 2 commandes dans le terminal tu verras le résultat, le fichier est dupliqué au même endroit que l'original .


----------



## francois_francois (18 Septembre 2022)

J'ai changé une partie du script avec 

sleep 1
  echo "********************************************************"
  echo "remplace ; par : dans chaque ligne entre email et pass"
  echo "et supprime point interrogation en fin de ligne en trop..."
for file in *.txt
do
  echo "=> Traitement de $file ..."
  sed -i '' 's/;/:/g' $file
  sed -i '' 's/¿$//' $file
done 
  echo ""

Autre chose,

Comment effacer un fichier nommé "final.txt-e" qui peut etre (ou ne pas etre) present
la commande est :
rm final.txt-e

Le probleme, c'est comment indiqué cette suppression seulement si le ce fichier existe (sinon ca retourne une erreur a l'ecran) 
rm: final.txt-e: No such file or directory

merci


----------



## francois_francois (18 Septembre 2022)

J'ai fait ca :



> sleep 1
> echo "********************************************************"
> echo "Renommage de $file avec _NOdoublon_Nopointvirgule_trie..."
> mv final.txt final_NOdoublon_Nopointvirgule_trie.txt
> ...


----------



## zeltron54 (18 Septembre 2022)

Pour les 2 ' on en parlait là : https://forums.macg.co/threads/commande-sed-changement-caractere.1310973/  post #8 et #9

Pour effacer tes fichiers "final.txt-e" qui ont donc été créé par la commande sed   sans les 2 '
Faire un test pour vérifier si existe:

exemple


```
if [ -e /Users/xxxxxxx/Desktop/final.txt-e.txt ]
then
    echo "Mon fichier existe"
Faire le rm ....
fi
```

Edit : j'arrive après la bagarre LOL, j'avais pas actualisé la page.


----------



## francois_francois (19 Septembre 2022)

Merci des retours.

Une question purement esthetique, 
Une ligne du script affiche du texte, puis une variable. 
Cependant, il y a un grand espace entre la fin du texte, et la variable (alors qu'il n'est pas présent dans la ligne de code).



> echo "nombre de fichiers texte dans le dossier... = $variable"










comment ne pas laisser cet espace vide ?

Merci


----------



## zeltron54 (19 Septembre 2022)

Bonjour,
Aucune idée !
Je n'arrive pas à reproduire ton problème chez moi. Comment est défini ta variable ?
tu peux éventuellement essayer d'afficher le texte  puis la variable , mais j'y crois pas trop !


```
echo "nombre de fichiers texte dans le dossier... =" $variable
```

Sinon pour le reste cela fonctionne ?


----------



## francois_francois (19 Septembre 2022)

@zeltron54

le code


> echo "nombre de fichiers texte dans le dossier... =" $variable


fonctionne mieux, ca affiche bien maintenant


> nombre de fichiers texte dans le dossier... = 1



Sinon, le script fonctionne très bien.
ca prend du temps c'est tout.

L'extraction des mails par pays, prends 10  jours pour 18 GIGAS de données


----------



## francois_francois (20 Septembre 2022)

Autre probleme,

Comment fait on pour supprimer tous les fichiers texte d'un dossier, sauf 1 en particulier (contient le mot "final") ?

Merci

J'ai ca mais evidement ca fait pas exactement la boulot


> sleep 1
> if [ -e _Pays_.txt ]
> then
> echo "********************************************************"
> ...


----------



## zeltron54 (20 Septembre 2022)

Peut être en faisant un test pour vérifier si c'es tun  ".txt'
Puis si c'est un .txt verifier si le nom est "final.txt" si oui tu fais rien sinon tu supprimes.


----------



## francois_francois (20 Septembre 2022)

J'ai testé ca, mais j'ai une erreur

/Users/xxx/Desktop/GLOBAL_merge_supprime_pointvirgule_et_retire_doublon_supprime_les_fichiers_sources_puis_trie_version5.6.sh: line 35: syntax error near unexpected token `('
/Users/xxx/Desktop/GLOBAL_merge_supprime_pointvirgule_et_retire_doublon_supprime_les_fichiers_sources_puis_trie_version5.6.sh: line 35: `rm -v !("_final_.txt")'



> sleep 1
> if [ -e _final_.txt ]
> then
> echo "********************************************************"
> ...


----------



## zeltron54 (20 Septembre 2022)

je pensais à un truc du genre:
J'ai initialisé une variable "fich" avec un chemin de fichier  pour mes tests en changeant le nom final.txt par différents nom. cela à l'air de fonctionner.

C'est pas la méthode la plus rapide (un par un) mais je ne sais plus comment exclure les, non texte et le final.txt
Alors en attendant de trouver mieux !


```
fich="/Users/xxxxxx/Desktop/final.txt"

if [ ${fich: -4} == ".txt" ]
then
echo "c'est un texte"
if [ ${fich: -9} == "final.txt" ]
then
echo “final.txt ne pas supprimer”
else
echo “je supprime fichier texte non final”
fi
else echo "fichier non texte"
fi
```


----------



## francois_francois (20 Septembre 2022)

je fais ca et ca fonctionne .

PS j'avais pas vu ton message au dessus zeltron54 avant de poster celui-ci



> sleep 1
> if [ -e _final_.txt ]
> then
> echo "********************************************************"
> ...


----------



## zeltron54 (20 Septembre 2022)

Ok , mais cela efface tous les fichiers autre que final.txt, même les fichiers non texte s'il y en a !
Dans ta demande j'avais cru comprendre que tu voulais effacer tous les fichiers "texte" autre que final.txt.


----------



## francois_francois (20 Septembre 2022)

@zeltron54, 

il n'y a que des fichiers textes dans chaque dossier.
Ca ne va pas etre genant, enfin je crois pas.

merci


----------



## francois_francois (20 Septembre 2022)

@zeltron54

 Faudra que que je relise les posts concernant le traitement des lignes d'un fichier texte pour retirer les "point d'interrogation" et changer les ";" en ":" sans passer par un fichier temporaire, car j'ai reessayé sans fichier temporaire, ca ne fonctionne pas.

L'inconvenient, du fichier temporaire, c'est qu'il sature le disque.


----------



## zeltron54 (21 Septembre 2022)

francois_francois a dit:


> retirer les "point d'interrogation" et changer les ";" en ":" sans passer par un fichier temporaire



Peux-tu poster le code que tu mets car chez moi cela fonctionne.


----------



## francois_francois (8 Octobre 2022)

bonjour ,

J'etais absent un moment, je reprends ce jour l'accès a macg.co

J'ai un dossier qui s'appelle disons "mondossier".
Dans ce dossier, un fichier qui s'appelle "_test.txt"
Comment renommer le fichier avec le nom du dossier, ce qui donnerai "mondossier_test.txt"

j'ai bien trouvé ca pour mais ce n'est qu'une partie de la réponse.




> echo `pwd` | cut -d"/" -f5



xxx@iMac-de-xxx uk_Pays_Royaume-Uni % echo `pwd` | cut -d"/" -f5
uk_Pays_Royaume-Uni
xxx@iMac-de-xxx uk_Pays_Royaume-Uni %


merci


----------



## francois_francois (8 Octobre 2022)

zeltron54 a dit:


> Peux-tu poster le code que tu mets car chez moi cela fonctionne.





> sleep 1
> echo "********************************************************"
> echo "remplace ; par : dans chaque ligne entre email et pass"
> echo "et supprime point interrogation en fin de ligne en trop..."
> ...



y'a un txt-e qui est créé,
lors du trie, et suppression des doublons, y'a un fichier  XXXXXXXXXXX.txt.tmp qui est créé aussi.

SI j'ai bonne memoire j'ai repris le code ci-dessus sinon les "point d'interrogation a l'envers en fin de ligne" etaient supprimés aleatoirement


----------



## zeltron54 (8 Octobre 2022)

Bonjour,

Dans ton script, comme déjà dit remplaces tes 2 lignes sed par : "sed -1 '' -e 's/;/:/g' "$fich" idem pour la 2 ième. Ceci fait que le script travaille directement dans le fichier d'origine sans créer de fichiers temp.

ce qui donne pour ces 2 lignes :


```
sed -i '' -e 's/;/:/g' "$file"
    sed -i '' -e 's/¿$//' "$file"
```



francois_francois a dit:


>



Pour ton script qui trie (je ne le connaît pas) il semble que ce soit lui que crée tes 2 fichiers, pas le script de remplacement de ; et de suppression de ¿


----------



## zeltron54 (8 Octobre 2022)

francois_francois a dit:


> J'ai un dossier qui s'appelle disons "mondossier".
> Dans ce dossier, un fichier qui s'appelle "_test.txt"
> Comment renommer le fichier avec le nom du dossier, ce qui donnerai "mondossier_test.txt"


Pour renommer un fichier la commande est
mv ancien_nom nouveau_nom
Si tu n'as que le chemin du fichier à renommer, tu récupères le nom du répertoire, puis le nom du fichier, tu concatènes les 2 variables, puis tu passes la commande avec les 2 chemins complets.
un exemple:


```
#!/bin/bash
fich="/Users/xxxxxx/Desktop/letest/final.txt"

reper=`dirname $fich`
echo "$reper"
par=`basename $reper`
lefich=`basename $fich`
newnom="$par$lefich"

mv $fich "$reper"/"$newnom"
```

J'ai mis dans "fich" le chemin du fichier à renommer
je récupère le chemin du dossier dans "reper"
je récupère le nom du dossier dans "par"
je récupère le nom du fichier dans "lefich"
je construis, concatène, le nouveau nom dans "newnom"
puis je renomme le fichier.

Il doit y avoir plus simple, mais je ne connaît pas trop  !


----------



## francois_francois (9 Octobre 2022)

@zeltron54

J'ai oublié de préciser :

Concernant ma premiere demande (recupérer le nom d'un dossier).
J'ai 35 dossiers, qui contiennent chacun un fichier texte.

Avant d'etre renommé, tous les fichiers texte dans chacun des 35 dossiers s'appellent tous "final_NOdoublon_Nopointvirgule_trie.txt".

Il faut qu'il devienne "fr_Pays_France_NOdoublon_Nopointvirgule_trie.txt" (pour celui qui se trouve dans le dossier "fr_Pays_France")

Il faut qu'il devienne "com_Pays_Commercial_NOdoublon_Nopointvirgule_trie.txt" (pour celui qui se trouve dans le dossier "com_Pays_Commercial")

etc...pour l'intéralité des dossiers.

Une fois fini ca donne ca:







Comme j'ajoute regulierement des nouvelles entrées aux fichiers texte, que je relance le script pour les trier, ceux-ci reprennent leur nom de départ "final_NOdoublon_Nopointvirgule_trie.txt" (ca m'aide a voir quel fichier a été traité ou pas avec le mot 'final'), du coup a chaque fois, je dois les renommer a la main, d'ou ma demande pour que cela soit fait de maniere automatique


----------



## zeltron54 (9 Octobre 2022)

francois_francois a dit:


> Il faut qu'il devienne "fr_Pays_France_NOdoublon_Nopointvirgule_trie.txt" (pour celui qui se trouve dans le dossier "fr_Pays_France")


Donc ajouter le nom du dossier plus  "_"  devant le nom du fichier dont on aura supprimer "final"

Dans mon script tu remplaces la ligne qui construit le nom du fichier...

```
newnom="$par$lefich"
```
par

```
newnom="$par"_NOdoublon_Nopointvirgule_trie.txt""
```

Je précise que la commande pwd, que tu mentionnais, retourne le chemin du dossier dans lequel tu te trouves (après un "cd" par exemple) alors que mon script récupère le dossier contenant le fichier passé en argument.


----------



## francois_francois (9 Octobre 2022)

je test dès que possible, et reviens vous rendre compte.
Merci


----------



## francois_francois (9 Octobre 2022)

de retour,

 ca ne fonctionne pas vraiment.

voici la video de la manoeuvre
C est le dossier ou se trouve tous les dossiers/fichiers a renommer qui est lui meme renommer









						8.84 MB file on MEGA
					






					mega.nz


----------



## zeltron54 (10 Octobre 2022)

Ben oui ! tu lui passes le dossier en argument  ! 
Il faut lui passer le fichier à renommer, pas le dossier...


----------



## zeltron54 (10 Octobre 2022)

Si tu veux lui passer le dossier en argument, alors le script devient:
Dans l'exemple ci-dessous mon dossier "montest" qui est sur le bureau content un fichier "final.txt"
Après exécution le fichier est renommé "montest_final.txt"


```
ledos="/Users/xxxxx/Desktop/montest"

fich=`ls $ledos`
par=`basename $ledos`
newnom="$par"_"$fich"

mv $ledos"/"$fich "$ledos"/"$newnom"
```


----------



## francois_francois (11 Octobre 2022)

@zeltron54

Tout d'abord merci de la peine que tu te donne.

Je suis en train de me perdre dans les versions des scripts proposés, du coup si tu es d'accord, on va faire plus simple. 
Je (re)décris exactement ce que je souhaite, j'ai été confu, ca n'a fait que conplexifié les choses.

------------------------------------------------

• J'ai un dossier (qui s'appelle test) ou se trouve se trouve un certain nombre de sous-dossiers (dans le cas présent, 35 dossiers.)
• Chacun des 35 sous-dossiers, a un nom différent, mais ont en commun le mot "_Pays_" dans leur nom.
(*exemple :* va_Pays_Vatican  ,  mc_Pays_Monaco , dz_Pays_Algérie , etc...)
• chacun de 35 sous-dossiers contient un fichier texte qui a toujours le même nom "final_NOdoublon_Nopointvirgule_trie.txt"

=> Je souhaite que le nom du fichier texte de chaque sous-dossier, soit partiellement renommé avec le nom du dossier qui le contient.

*exemple :*
Le dossier "va_Pays_Vatican" , contient "final_NOdoublon_Nopointvirgule_trie.txt"
"final_NOdoublon_Nopointvirgule_trie.txt" devient  "va_Pays_Vatican_NOdoublon_Nopointvirgule_trie.txt"

Je souhaite que le script renomme les 35 fichiers textes, en une seule passe (que je ne n'ai pas lancer 35 fois le script).

Merci,


----------



## zeltron54 (11 Octobre 2022)

Le script qui renomme donc tous les fichiers de tous les dossiers contenus dans le dossier "test"

Dans mon script la première ligne défini le chemin du dossier "test" à toi de la modifier pour l'adapter au chemin de ton dossier "test".


```
#!/bin/bash

ledossier="/Users/xxxxxxx/Desktop/test"

cd $ledossier

for dir in *
do
dir=${dir%*/}
ledos=$ledossier"/"$dir
fich=`ls "$ledos"`

ancien_nom=$ledos"/"$fich
newnom=$ledos"/"$dir"_"$fich

mv "$ancien_nom" "$newnom"

done
```


----------



## francois_francois (12 Octobre 2022)

Je fais un essai. Je reviens après. merci

Essai effectué,
L'ajout de "xx_Pays_xxxxxx" c'est bon, mais le mot "final" n'est pas supprimé.


----------



## zeltron54 (12 Octobre 2022)

Bonsoir,

J'avais complétement zapper ce détail de supprimer "final"
Comme tous les fichiers ont le même nom, c'est plus simple, je te met le nouveau script.


```
#!/bin/bash

ledossier="/Users/xxxxx/Desktop/test"

cd $ledossier

for dir in *
do
dir=${dir%*/}
ledos=$ledossier"/"$dir
fich=`ls "$ledos"`

ancien_nom=$ledos"/"$fich
newnom=$ledos"/"$dir"_NOdoublon_Nopointvirgule_trie.txt"

mv "$ancien_nom" "$newnom"

done
```


----------



## francois_francois (13 Octobre 2022)

Merci pour la correction.

Je reviens sur un detail d'une partie du script (qui est bien plus long que la partie posté plus bas), ca fonctionne mais parfois j'ai une erreur





la partie du script en question qui pose parfois l'erreur , "BINARY OPERATOR EXPECTED" :



```
sleep 1
if [ -e *final*.txt ]
then
  echo "********************************************************"
  echo "suppression dans le dossier des fichiers texte source sauf final.txt..."
find . \! -name '*final*.txt' -delete
echo ""
else
echo "pas d'autres fichiers que *final*.txt, aucune suppression..."
  echo ""
fi
```


----------



## zeltron54 (14 Octobre 2022)

Bonjour,
Après quelques tests, il semblerait que l'erreur vienne de la ligne 
	
	



```
if [ -e *final*.txt ]
```
 le jocker * en fin de nom à l'air de causer le problème.

Essai en la remplaçant par  
	
	



```
if [ "-e final.txt" ]
```


----------

