Recherche de caractères spéciaux à la volée ?

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
voila le script qui supprime les > et <
et qui traite les fichiers sans extension puis les renomme toujours sans extension
et sans le point à la fin.

Tiens moi au courant !

Bloc de code:
-- renomme les fichiers et les dossiers en supprimant les caractères spéciaux
--ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#",;?!.\><
--AAAaAAaaaaaaOOOOOoooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn---------------__--
tell application "Finder"
    set lechemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers et dossiers à traiter"
    my inspecter(lechemin)
end tell

tell application "Finder"
    my inspecter(lechemin)
end tell

on inspecter(lechemin)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of lechemin
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                try
                    set lefichier to chaque_fichier
                    set AppleScript's text item delimiters to {""}
                    set nom to name of chaque_fichier --récupère le nom du fichier
                    set extens to file nom in lechemin --recupere l extension du fichier
                    set lextension to name extension of extens
                    if lextension is not "" then
                        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
                        set elements to text items of nom
                        set nomcourt to (items 1 thru -2 of elements) as string
                        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    else
                        set nomcourt to nom
                    end if
                on error
                    set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                    write "Le nom du fichier n'a pas pu être extrait : " & lefichier & return to lelog starting at eof
                    close access lelog
                end try
                set pourerreur to lefichier as string
                set nouveaunom to my remplace(nomcourt, pourerreur)
               
                if nomcourt is not nouveaunom then
                    try
                        set a to container of lefichier as string
                        set verifexist to a & nouveaunom & "." & lextension
                        if exists verifexist then
                            set nouveaunom to nouveaunom & "2"
                        end if
                        if lextension = "" then
                            set name of lefichier to nouveaunom
                        else
                            set name of lefichier to nouveaunom & "." & lextension -- renomme le fichier
                        end if
                        -- Ecrit un fichier erreur sur le bureau si erreur
                    on error
                        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                        write "Le fichier n'a pas pu être renommer : " & pourerreur & return to lelog starting at eof
                        close access lelog
                    end try
                end if
               
            end tell
        end repeat
       
        set a to container of lechemin as string
        set aa to lechemin as string
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
        set nomcourt to (text item -2 of aa) as string
        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
        set pourerreur to aa
       
        set nouveaunom to my remplace(nomcourt, pourerreur)
       
        if nomcourt is not nouveaunom then
            try
                set verifexist to a & nouveaunom
                if exists verifexist then
                    set nouveaunom to nouveaunom & "2"
                end if
                set name of lechemin to nouveaunom --renomme dossier
                set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
            on error
                -- Ecrit un fichier erreur sur le bureau si erreur
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le dossier n'a pas pu être reenommer : " & pourerreur & return to lelog starting at eof
                close access lelog
            end try
        end if
       
        -- traitement des dossiers :
        set les_dossiers to folders of lechemin
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

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

on remplace(mavar, pourerreur)
    set aremplacer to {203, 231, 229, 136, 128, 129, 136, 135, 137, 136, 138, 140, 241, 238, 239, 205, 133, 152, 151, 153, 155, 154, 233, 131, 230, 232, 143, 142, 144, 145, 130, 141, 237, 234, 235, 236, 147, 146, 148, 149, 244, 242, 243, 134, 157, 156, 158, 159, 216, 132, 150, 40, 41, 91, 93, 123, 125, 47, 37, 64, 35, 34, 44, 59, 63, 33, 46, 92, 62, 60}
    set par to {65, 65, 65, 97, 65, 65, 97, 97, 97, 97, 97, 97, 79, 79, 79, 79, 79, 111, 111, 111, 111, 111, 69, 69, 69, 69, 101, 101, 101, 101, 67, 99, 73, 73, 73, 73, 105, 105, 105, 105, 85, 85, 85, 85, 117, 117, 117, 117, 121, 78, 110, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 95, 95, 45, 45}
    set nbar to count aremplacer
    set new to mavar
   
    set lesblancs to count character in new
    repeat
        if character lesblancs of new is not " " then
            exit repeat
        end if
        set new to text 1 thru (lesblancs - 1) of new
        set lesblancs to count characters in new
    end repeat
    repeat
        if character 1 of new is not " " then
            exit repeat
        end if
        set new to text 2 thru lesblancs of new
        set lesblancs to count characters in new
    end repeat
   
   
    set nb to count characters in new
    set mavar to new
    try
        repeat with i from 1 to nb
            set a to character i in mavar
            set lavaleur to ASCII number a
            repeat with j from 1 to nbar
                if item j of aremplacer is lavaleur then
                    if lavaleur = 60 or lavaleur = 62 then --traite le ><
                        if i = 1 then
                            set new to (text 2 thru nb of mavar)
                            set avant to ""
                        else
                            set avant to text 1 thru (i - 1) of new
                        end if
                        if i = nb then
                            set new to avant
                        else
                            set new to avant & text nb thru -(nb - i) of mavar
                        end if
                       
                    else --traite les autres caracteres
                        set newcar to ASCII character (item j of par)
                        if i = 1 then
                            set new to newcar & (text 2 thru nb of new)
                            set avant to ""
                        else
                            set avant to text 1 thru (i - 1) of new
                        end if
                        if i = nb then
                            set new to avant & newcar
                        else
                            set new to avant & newcar & text nb thru -(nb - i) of mavar
                        end if
                    end if
                end if
            end repeat
        end repeat
    on error
        -- Ecrit un fichier erreur sur le bureau si erreur
        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
        write "Le caractère n'a pas pu être remplacer : " & pourerreur & return to lelog starting at eof
        close access lelog
    end try
    set mavar to new
end remplace
 
Dernière édition:

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
Oups ! ne prend pas le dernier script, il y a un bug !
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
Bon voila le new !
j'espère avoir supprimer tous les bugs !
tiens moi au courant !
Bloc de code:
-- renomme les fichiers et les dossiers en supprimant les caractères spéciaux
--ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#",;?!.\><
--AAAaAAaaaaaaOOOOOoooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn---------------__--
tell application "Finder"
    set lechemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers et dossiers à traiter"
    my inspecter(lechemin)
end tell

tell application "Finder"
    my inspecter(lechemin)
end tell

on inspecter(lechemin)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of lechemin
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                try
                    set lefichier to chaque_fichier
                    set AppleScript's text item delimiters to {""}
                    set nom to name of chaque_fichier --récupère le nom du fichier
                    set extens to file nom in lechemin --recupere l extension du fichier
                    set lextension to name extension of extens
                    if lextension is not "" then
                        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
                        set elements to text items of nom
                        set nomcourt to (items 1 thru -2 of elements) as string
                        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    else
                        set nomcourt to nom
                    end if
                on error
                    set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                    write "Le nom du fichier n'a pas pu être extrait : " & lefichier & return to lelog starting at eof
                    close access lelog
                end try
                set pourerreur to lefichier as string
                set nouveaunom to my remplace(nomcourt, pourerreur)
              
                if nomcourt is not nouveaunom then
                    try
                        set a to container of lefichier as string
                        set verifexist to a & nouveaunom & "." & lextension
                        if exists verifexist then
                            set nouveaunom to nouveaunom & "2"
                        end if
                        if lextension = "" then
                            set name of lefichier to nouveaunom
                        else
                            set name of lefichier to nouveaunom & "." & lextension -- renomme le fichier
                        end if
                        -- Ecrit un fichier erreur sur le bureau si erreur
                    on error
                        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                        write "Le fichier n'a pas pu être renommer : " & pourerreur & return to lelog starting at eof
                        close access lelog
                    end try
                end if
              
            end tell
        end repeat
      
        set a to container of lechemin as string
        set aa to lechemin as string
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
        set nomcourt to (text item -2 of aa) as string
        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
        set pourerreur to aa
      
        set nouveaunom to my remplace(nomcourt, pourerreur)
      
        if nomcourt is not nouveaunom then
            try
                set verifexist to a & nouveaunom
                if exists verifexist then
                    set nouveaunom to nouveaunom & "2"
                end if
                set name of lechemin to nouveaunom --renomme dossier
                set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
            on error
                -- Ecrit un fichier erreur sur le bureau si erreur
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le dossier n'a pas pu être reenommer : " & pourerreur & return to lelog starting at eof
                close access lelog
            end try
        end if
      
        -- traitement des dossiers :
        set les_dossiers to folders of lechemin
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

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

on remplace(mavar, pourerreur)
    set aremplacer to {203, 231, 229, 136, 128, 129, 136, 135, 137, 136, 138, 140, 241, 238, 239, 205, 133, 152, 151, 153, 155, 154, 233, 131, 230, 232, 143, 142, 144, 145, 130, 141, 237, 234, 235, 236, 147, 146, 148, 149, 244, 242, 243, 134, 157, 156, 158, 159, 216, 132, 150, 40, 41, 91, 93, 123, 125, 47, 37, 64, 35, 34, 44, 59, 63, 33, 46, 92, 62, 60}
    set par to {65, 65, 65, 97, 65, 65, 97, 97, 97, 97, 97, 97, 79, 79, 79, 79, 79, 111, 111, 111, 111, 111, 69, 69, 69, 69, 101, 101, 101, 101, 67, 99, 73, 73, 73, 73, 105, 105, 105, 105, 85, 85, 85, 85, 117, 117, 117, 117, 121, 78, 110, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 95, 95, 45, 45}
    set nbar to count aremplacer
    set new to mavar
    --supprime les espaces debut et fin
    set lesblancs to count character in new
    repeat
        if character lesblancs of new is not " " then
            exit repeat
        end if
        set new to text 1 thru (lesblancs - 1) of new
        set lesblancs to count characters in new
    end repeat
    repeat
        if character 1 of new is not " " then
            exit repeat
        end if
        set new to text 2 thru lesblancs of new
        set lesblancs to count characters in new
    end repeat
    --supprime les superieur et inferieur
    set supinf to new
    set a to 1
    repeat
        set fin to count character in supinf
        if a > fin then exit repeat
        set c to character a in supinf
        if c = ">" or c = "<" then
            if a = 1 then
                set supinf to text 2 thru fin of supinf
            else
                if a = fin then
                    set supinf to text 1 thru -2 of supinf
                else
                    set supinf to text 1 thru -(fin - (a - 2)) of supinf & text (a + 1) thru fin of supinf
                    set a to a - 1
                end if
            end if
        end if
        set a to a + 1
    end repeat
    set new to supinf
    -- remplace le caracteres
    set nb to count characters in new
    set mavar to new
    try
        repeat with i from 1 to nb
            set a to character i in mavar
            set lavaleur to ASCII number a
            repeat with j from 1 to nbar
                if item j of aremplacer is lavaleur then
                  
                    set newcar to ASCII character (item j of par)
                    if i = 1 then
                        set new to newcar & (text 2 thru nb of new)
                        set avant to ""
                    else
                        set avant to text 1 thru (i - 1) of new
                    end if
                    if i = nb then
                        set new to avant & newcar
                    else
                        set new to avant & newcar & text nb thru -(nb - i) of mavar
                    end if
                end if
            end repeat
        end repeat
    on error
        -- Ecrit un fichier erreur sur le bureau si erreur
        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
        write "Le caractère n'a pas pu être remplacer : " & pourerreur & return to lelog starting at eof
        close access lelog
    end try
    set mavar to new
end remplace
 
Dernière édition:

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
Je viens d'éditer le script, si tu l'as déjà pris , recharge le !
J'avais collé une ancienne version
 

Boyo

Membre actif
27 Octobre 2004
264
7
59
Bordeaux
Je pense que tu vas finir par pouvoir déposer les armes, bientôt... :D

Capture d’écran 2021-11-10 à 15.49.57.jpg
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
Enfin !
Content pour toi!
:up:
 

Boyo

Membre actif
27 Octobre 2004
264
7
59
Bordeaux
Zeltron54, je te dois une fière chandelle tout de même.
1000 mercis pour ta disponibilité et tes compétences qui ont eu raison de cette faille fort idiote dans la synchronisation des volumes sous OneDrive.
Hormis que je vais le faire circuler auprès des autres collègues graphistes qui rencontrent le même problème entre leur Imac et leur portables, ça peut intéresser d'autres personnes en galère de synchros sur OneDrive.

Et si jamais je peux te renvoyer la balle par un moyen ou un autre, ce sera avec grand plaisir.

Zeltron54.jpg
 
Dernière édition:

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 495
397
Lorraine
Sympa de ta part !
De plus j'ai encore trouvé un cas qui pouvais poser problème : si plusieurs caractères > ou < se suivent en début ou en fin du nom.
donc voila la modif pour prendre ce cas en compte.

Ce script ayant été écrit sur le pouce pour un cas spécial, il n'est pas du tout optimisé et surtout "bordélique" à force de rajouté des petits bouts il est très mal structuré, mais bon ça fonctionne...
Dans ta dropbox... c'est bien, mais il reste disponible sur le site !

Bloc de code:
-- renomme les fichiers et les dossiers en supprimant les caractères spéciaux
--ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#",;?!.\><
--AAAaAAaaaaaaOOOOOoooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn---------------__--
tell application "Finder"
    set lechemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers et dossiers à traiter"
    my inspecter(lechemin)
end tell

tell application "Finder"
    my inspecter(lechemin)
end tell

on inspecter(lechemin)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of lechemin
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                try
                    set lefichier to chaque_fichier
                    set AppleScript's text item delimiters to {""}
                    set nom to name of chaque_fichier --récupère le nom du fichier
                    set extens to file nom in lechemin --recupere l extension du fichier
                    set lextension to name extension of extens
                    if lextension is not "" then
                        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
                        set elements to text items of nom
                        set nomcourt to (items 1 thru -2 of elements) as string
                        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    else
                        set nomcourt to nom
                    end if
                on error
                    set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                    write "Le nom du fichier n'a pas pu être extrait : " & lefichier & return to lelog starting at eof
                    close access lelog
                end try
                set pourerreur to lefichier as string
                set nouveaunom to my remplace(nomcourt, pourerreur)
               
                if nomcourt is not nouveaunom then
                    try
                        set a to container of lefichier as string
                        set verifexist to a & nouveaunom & "." & lextension
                        if exists verifexist then
                            set nouveaunom to nouveaunom & "2"
                        end if
                        if lextension = "" then
                            set name of lefichier to nouveaunom
                        else
                            set name of lefichier to nouveaunom & "." & lextension -- renomme le fichier
                        end if
                        -- Ecrit un fichier erreur sur le bureau si erreur
                    on error
                        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                        write "Le fichier n'a pas pu être renommer : " & pourerreur & return to lelog starting at eof
                        close access lelog
                    end try
                end if
               
            end tell
        end repeat
       
        set a to container of lechemin as string
        set aa to lechemin as string
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
        set nomcourt to (text item -2 of aa) as string
        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
        set pourerreur to aa
       
        set nouveaunom to my remplace(nomcourt, pourerreur)
       
        if nomcourt is not nouveaunom then
            try
                set verifexist to a & nouveaunom
                if exists verifexist then
                    set nouveaunom to nouveaunom & "2"
                end if
                set name of lechemin to nouveaunom --renomme dossier
                set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
            on error
                -- Ecrit un fichier erreur sur le bureau si erreur
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le dossier n'a pas pu être reenommer : " & pourerreur & return to lelog starting at eof
                close access lelog
            end try
        end if
       
        -- traitement des dossiers :
        set les_dossiers to folders of lechemin
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

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

on remplace(mavar, pourerreur)
    set aremplacer to {203, 231, 229, 136, 128, 129, 136, 135, 137, 136, 138, 140, 241, 238, 239, 205, 133, 152, 151, 153, 155, 154, 233, 131, 230, 232, 143, 142, 144, 145, 130, 141, 237, 234, 235, 236, 147, 146, 148, 149, 244, 242, 243, 134, 157, 156, 158, 159, 216, 132, 150, 40, 41, 91, 93, 123, 125, 47, 37, 64, 35, 34, 44, 59, 63, 33, 46, 92, 62, 60}
    set par to {65, 65, 65, 97, 65, 65, 97, 97, 97, 97, 97, 97, 79, 79, 79, 79, 79, 111, 111, 111, 111, 111, 69, 69, 69, 69, 101, 101, 101, 101, 67, 99, 73, 73, 73, 73, 105, 105, 105, 105, 85, 85, 85, 85, 117, 117, 117, 117, 121, 78, 110, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 95, 95, 45, 45}
    set nbar to count aremplacer
    set new to mavar
    --supprime les espaces debut et fin
    set lesblancs to count character in new
    repeat
        if character lesblancs of new is not " " then
            exit repeat
        end if
        set new to text 1 thru (lesblancs - 1) of new
        set lesblancs to count characters in new
    end repeat
    repeat
        if character 1 of new is not " " then
            exit repeat
        end if
        set new to text 2 thru lesblancs of new
        set lesblancs to count characters in new
    end repeat
    --supprime les superieur et inferieur
    set supinf to new
    set a to 1
    repeat
        set fin to count character in supinf
        if a > fin then exit repeat
        set c to character a in supinf
        if c = ">" or c = "<" then
            if a = 1 then
                set supinf to text 2 thru fin of supinf
                set a to a - 1
            else
                if a = fin then
                    set supinf to text 1 thru -2 of supinf
                else
                    set supinf to text 1 thru -(fin - (a - 2)) of supinf & text (a + 1) thru fin of supinf
                    set a to a - 1
                end if
            end if
        end if
        set a to a + 1
    end repeat
    set new to supinf
    -- remplace le caracteres
    set nb to count characters in new
    set mavar to new
    try
        repeat with i from 1 to nb
            set a to character i in mavar
            set lavaleur to ASCII number a
            repeat with j from 1 to nbar
                if item j of aremplacer is lavaleur then
                   
                    set newcar to ASCII character (item j of par)
                    if i = 1 then
                        set new to newcar & (text 2 thru nb of new)
                        set avant to ""
                    else
                        set avant to text 1 thru (i - 1) of new
                    end if
                    if i = nb then
                        set new to avant & newcar
                    else
                        set new to avant & newcar & text nb thru -(nb - i) of mavar
                    end if
                end if
            end repeat
        end repeat
    on error
        -- Ecrit un fichier erreur sur le bureau si erreur
        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
        write "Le caractère n'a pas pu être remplacer : " & pourerreur & return to lelog starting at eof
        close access lelog
    end try
    set mavar to new
end remplace
 

Boyo

Membre actif
27 Octobre 2004
264
7
59
Bordeaux
Ah ben oui, et c'est mieux ici, suis-je bête.
Je modifie mon post.

Je précise que tout ces fichiers accentués ou comportant des caractères spéciaux sont uniquement de vieux fichiers. Les nouveaux accentués ne posent pas de problème particuliers et passent le filtre de la synchro sans souci.
Alors adishats, comme on dit en Gascogne !
Et encore merci !