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

Boyo

Membre actif
27 Octobre 2004
264
7
62
Bordeaux
Bonjour
J'ai des soucis de synchronisation de dossiers d'un volume à l'autre avec l'outil One Drive (Microsoft pro) qui refuse de synchroniser tous les anciens caractères accentués, les slash, les espaces, les parenthèses… dans tous les fichiers ou dossiers qui en contient.
Je cherche donc un moyen de sélectionner des paquets de dossiers, d'y faire une recherche pour y repérer tous les é, les /, les (),… afin de les supprimer ou les remplacer. Mais l'outil Cmd + F ne permet pas les remplacements. Alors pour l'instant, je dois repérer et supprimer chaque caractère un par un, ce qui est juste titanesque.
Des idées plus efficaces svp ?
 
si tu en a vraiment l'utilité 24€95 c'est pas cher payé !!! …
 
  • J’aime
Réactions: Boyo
@Boyo
Bonjour,

Tu peux aussi renommer les fichiers et dossiers avec un applescript.
Il faudrait avoir la liste des caractères à changer et la liste des caractères de remplacement.

Par exemple par quoi remplacer les ( ) [ ] { } / \ %
 
Dernière édition:
  • J’aime
Réactions: Boyo
Bonsoir,
Je t'ai écris un petit script qui fait le job !
au lancement il te demande de sélectionner le dossier contenant les fichiers et dossiers à traiter.
Il remplace dans les noms les caractères accentués par le même caractère sans accent et les caractères ()[]{}/%@# par des tirets. Et ce pour tous les fichiers, dossiers et sous-dossiers.
Quand il à terminé, il te met un message de fin !
Dis moi si cela te convient ?


Bloc de code:
-- renomme les fichiers et les dossiers en supprimant les caractères spéciaux
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"
                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 document file nom in lechemin --recupere l extension du fichier
                set lextension to name extension of extens
                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
              
                set nouveaunom to my remplace(nomcourt)
                set name of lefichier to (nouveaunom & "." & lextension) -- renomme le fichier
            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 nouveaunom to my remplace(nomcourt)
        set name of lechemin to nouveaunom --renomme dossier
      
        set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
      
        -- 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)
  
    set aremplacer to "ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#"
    set par to "AAAaAAaaaaaaOOOOOoooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn----------"
  
    set nb to count characters in mavar
    set new to mavar
    repeat with i from 1 to nb
        set a to character i in new
        if a is in aremplacer then
            set place to offset of a in aremplacer
            set newcar to characters place thru place of par
            set avant to text 1 thru (i - 1) of new
            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
    set mavar to new
    return mavar
end remplace
 
Dernière édition:
  • J’aime
Réactions: Aliboron
Wow... Ça c'est tout de même extrêmement sympa...
Grand merci Zeltron54 !!!
Je ne suis pas très familier des scripts, mais je pense que ça se copie-colle dans le Terminal, c'est ça ?
 
Non ! Pas dans le terminal .

ça se copie dans "Editeur de script" qui se trouve dans applications--> Utilitaires
Un simple copié-coller du script, puis un clic sur le bouton Exécuter, (en haut à gauche)
 
Après quelques essais plus approfondi je me rend compte que les majuscules accentuées peuvent poser problèmes, donc je les remplace par des minuscules.
Le nouveau script.

Bloc de code:
-- renomme les fichiers et les dossiers en supprimant les caractères spéciaux
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"
                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 document file nom in lechemin --recupere l extension du fichier
                set lextension to name extension of extens
                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
                
                set nouveaunom to my remplace(nomcourt)
                set name of lefichier to (nouveaunom & "." & lextension) -- renomme le fichier
            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 nouveaunom to my remplace(nomcourt)
        set name of lechemin to nouveaunom --renomme dossier
        
        set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
        
        -- 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)
    
    set aremplacer to "ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#"
    set par to "aaaaaaaaaaaaooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn----------"
    
    set nb to count characters in mavar
    set new to mavar
    repeat with i from 1 to nb
        set a to character i in new
        if a is in aremplacer then
            set place to offset of a in aremplacer
            set newcar to characters place thru place of par
            set avant to text 1 thru (i - 1) of new
            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
    set mavar to new
    return mavar
end remplace
 
Ok je comprends. Je ne le testerai que lundi maintenant car il s'agit d'un disque pro d'une collectivité territoriale à partir duquel le OneDrive est rattaché.
Par contre, penses-tu que ce soit éventuellement réversible ?
Tu ne penses pas que ça concernera aussi les fichiers invisibles liés au système et que ça peut éventuellement corrompre quelque chose ?
 
Bonjour,

Testes d'abord sur une copie, un Bug est toujours possible.
Non malheureusement ce n'est pas réversible, les nom des fichiers et dossiers sont remplacés d'où la nécessité de travailler sur une copie.
le script ne travaille que sur les fichiers et dossiers visibles inclus dans le dossier sélectionné.
Pour moi pas de risque vis à vis du système.

Pour ce qui est de corrompre ! rien de plus ni de moins que de changer les noms de fichiers et dossiers à la main...

Tiens moi au courant de tes essais!
 
Je te remercie beaucoup. Mais je ne vois pas comment je peux faire une copie, et de quoi en fait ? Le script concerne l'ensemble des fichiers du volume en question non ?
 
si c'est le disque de démarrage il te faut travailler par dossier contenu dans le dossier users-->ton nom (la petite maison).

Si c'est un disque autre par dossier (autres que applications, système ou bibliothèque... ) bref tes documents...
 
Je t'ai refait une version qui conserve les lettres majuscules (si majuscule accentuée, la remplace par majuscule sans accent)

Pour info les caractères qui sont remplacés sont:
ÀÁÂàÄÅàáâàäåÒÓÔÕÖòóôõöÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]{}/%@#

ils sont remplacés par :
AAAaAAaaaaaaOOOOOoooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn----------

le premier par le premier le deuxième par le deuxième etc...
si tu as d'autres caractères à remplacer fait moi signe pour les ajouter...

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"
                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 document file nom in lechemin --recupere l extension du fichier
                set lextension to name extension of extens
                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
               
                set nouveaunom to my remplace(nomcourt)
                set name of lefichier to (nouveaunom & "." & lextension) -- renomme le fichier
            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 nouveaunom to my remplace(nomcourt)
        set name of lechemin to nouveaunom --renomme dossier
       
        set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
       
        -- 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)
    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}
    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}
    set nbar to count aremplacer
    set nb to count characters in mavar
    set new to mavar
    repeat with i from 1 to nb
        set a to character i in new
        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)
                set avant to text 1 thru (i - 1) of new
                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
    set mavar to new
end remplace
 
Oupsss !

Un bug corrigé ! désolé

Je précise si le dossier contient une application (pas un document) une erreur sera générée. si tu veux pouvoir aussi modifier le nom des applications (ce qui peut être dangereux à mon sens) tu le précises, une légère modif du script pourra le permettre.

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"
                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 document file nom in lechemin --recupere l extension du fichier
                set lextension to name extension of extens
                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
               
                set nouveaunom to my remplace(nomcourt)
                if nomcourt is not nouveaunom then
                    set name of lefichier to (nouveaunom & "." & lextension) -- renomme le fichier
                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 nouveaunom to my remplace(nomcourt)
        if nomcourt is not nouveaunom then
            set name of lechemin to nouveaunom --renomme dossier
        end if
        set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
       
        -- 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)
    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}
    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}
    set nbar to count aremplacer
    set nb to count characters in mavar
    set new to mavar
    repeat with i from 1 to nb
        set a to character i in new
        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)
                set avant to text 1 thru (i - 1) of new
                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
    set mavar to new
end remplace
 
Dernière édition:
Je te rajoute la version qui renomme tous les fichiers y compris les applications ! A toi de voir celle qui te convient pour ton utilité...

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"
                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
                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
                
                set nouveaunom to my remplace(nomcourt)
                if nomcourt is not nouveaunom then
                    set name of lefichier to (nouveaunom & "." & lextension) -- renomme le fichier
                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 nouveaunom to my remplace(nomcourt)
        if nomcourt is not nouveaunom then
            set name of lechemin to nouveaunom --renomme dossier
            set lechemin to a & nouveaunom as alias --reconstruit le chemin pour dossier suivant
        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)
    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}
    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}
    set nbar to count aremplacer
    set nb to count characters in mavar
    set new to mavar
    repeat with i from 1 to nb
        set a to character i in new
        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)
                set avant to text 1 thru (i - 1) of new
                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
    set mavar to new
end remplace
 
Ok merci, mais du coup, comment donner une direction spécifique au script afin qu'il aille vers une destination de dossier et pas une autre ? Peut-on d'ailleurs lui donner une direction spécifique et pas une autre ?
Désolé, ce sont sûrement des questions de béotien…
 
Ah mais je n'avais pas vu toutes tes versions successives !! Wow !
Non, je ne pense pas que les applis puissent poser un quelconque problème, d'ailleurs, je ne synchronise que des fichiers.
Il y a quelques semaines, j'avais plus de 22 000 fichiers à problèmes... vertigineux...
Alors j'ai entamé la suppression de fontes dont je ne me servais absolument pas ou plus, genre TTF, et j'ai été chercher les fichiers un par un pour les renommer. J'en suis à près de 3000, quand même encore.
Donc ton taf va me servir grandement, sois en assuré.
 
Dis au message #6:
au lancement il te demande de sélectionner le dossier contenant les fichiers et dossiers à traiter.

Il traite alors tous les fichiers, dossier et sous dossiers contenu dans la dossier sélectionné.