Script de classement alphabétique

Sunken

Membre enregistré
11 Avril 2024
8
1
42
Hello à tous,

Pour des besoins de classement, je cherche en vain à créer un script me permettant de classer un grand nombre de fichiers dans des répertoires classés alphabétiquement.

Le but serait de créer un répertoire qui reprendrait la première lettre du nom de fichier:

-Répertoire "#" pour tous les fichiers commençant par un chiffre ou caractère spécial
-Répertoire "A" pour tous les fichiers commençant par A
-Répertoire "B" pour tous les fichiers commençant par B
etc...

Pour le moment, j'ai réussi à créer une commande via le terminal mais elle me crée un répertoire par fichier, ce qui n'arrange pas mon problème. Y aurait-il une solution plus simple en AppleScript par exemple pour automatiser tout ça?

Merci pour votre aide! :merci:
 
Bonjour,
Je pense qu'un petit applescript devrait pouvoir faire cela.

Question pour envisager de l'écrire:
Les fichiers à déplacer sont ils tous dans un dossier source (avec ou sans sous dossiers)?
S’il y a des sous dossiers y a t’il un risque d’avoir plusieurs fichiers avec le même nom ?
 
  • J’aime
Réactions: Sunken
Hello! Un compatriote du 54? ;)

Alors, tous les fichiers sont dans un seul dossier sans sous-dossiers. Les fichiers peuvent avoir le même nom de base mais la fin du nom de fichier est différente à chaque fois (aucun doublon).

L'idée est juste de regrouper dans un dossier comprenant la première lettre du nom de fichier. Pour tout ce qui est caractère spécial ou chiffre du style (, [, ., -, 0, 1, 2, etc...) dans un dossier "#". Je pensais à la base utiliser une fonction qui exclut toute lettre de l'alphabet pour simplifier le parsing.

La cerise sur le gâteau serait de pouvoir diviser les dossiers si les fichiers sont trop nombreux (du genre tous les 500 fichiers). Par exemple, les 500 premiers avec la lettre "S" dans un dossier S1, les 500 suivants dans un dossier S2, etc... Mais là on dépasse mes maigres compétences.

Un grand merci à toi en tout cas!
 
On va déjà commencer par les trier dans des dossiers alphabétiques, pour faire des dossiers de 500, on verra après !

Aller un script vite fait !

Alors je te propose
Tu crées un dossier pour la destination
Tu lances le script
le script te demande de sélectionner ton dossier source
Puis de sélectionner ton dossier destination
Il fait le job et te met un message lorsqu'il a terminé.

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 "triangle play" en haut à droite “Exécuter”
Bloc de code:
tell application "Finder"
   
    set lechemin to choose folder with prompt "Sélectionnez le Dossier principal à traiter ?"
    set dest to choose folder with prompt "Sélectionnez le Dossier destinataire ?"
    set chemindest to dest as string
    set tous to every file of entire contents of lechemin
   
    repeat with unfichier in tous
        set lenom to name of unfichier
        set initiale to character 1 of lenom
        set lenum to ASCII number of initiale
       
        if lenum > 65 and lenum < 91 then
        else
            if lenum > 96 and lenum < 123 then
            else
                set a to "#"
            end if
        end if
       
        if exists chemindest & initiale then
        else
            make new folder at dest with properties {name:initiale}
        end if
        set chemincopie to chemindest & initiale
       
        move unfichier to chemincopie
       
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: Sunken
Pour la suite, faire des dossiers de 500 fichiers max,

Quel doit être l'emplacement des dossiers S1, S2 etc...
  • Soit au même niveau que le dossier S
  • Soit dans le dossier S et si c'est le cas le dossier S ne contiendrait aucun fichier mais des dossiers S1, S2 etc... ou les 500 premiers fichiers et les dossiers S1, S2 etc... pour les suivants.

J'attends le retour sur le script et sur ces dernières questions !
 
  • J’aime
Réactions: Sunken
Je viens d'essayer à l'instant et tout fonctionne à merveille. J'ai juste l'impression qu'il ne prend pas en compte la partie du dossier # et il crée un dossier avec le premier caractère spécial ou chiffre du nom de fichier.

C'est peut-être lié à la commande set lenum to ASCII number of initiale. Ne serait-il pas plus simple de passer par une fonction du style "tout ce qui n'est pas une lettre"?

Un grand merci à toi en tout cas!
 
Oups une erreur dans le script il est resté des bribes de mes essais !
Le voila corrigé.
Bloc de code:
tell application "Finder"
    
    set lechemin to choose folder with prompt "Sélectionnez le Dossier principal à traiter ?"
    set dest to choose folder with prompt "Sélectionnez le Dossier destinataire ?"
    set chemindest to dest as string
    set tous to every file of entire contents of lechemin
    
    repeat with unfichier in tous
        set lenom to name of unfichier
        set initiale to character 1 of lenom
        set lenum to ASCII number of initiale
        
        if lenum > 65 and lenum < 91 then
        else
            if lenum > 96 and lenum < 123 then
            else
                set initiale to "#"
            end if
        end if
        
        if exists chemindest & initiale then
        else
            make new folder at dest with properties {name:initiale}
        end if
        set chemincopie to chemindest & initiale
        
        move unfichier to chemincopie
        
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: Sunken
Pour les dossiers 500 fichiers
Il y aurait donc un dossier par exemple pour le s : S avec les 500 premiers fichiers et un dossier S1 avec les 500 suivant et un dossier S2 avec les 500 suivant etc ...
C'est bien çà ?
 
  • J’aime
Réactions: Sunken
Voilà la suite !

Le script te demande de sélectionner le dossier contenant tous les dossiers A, B, C,etc..
il traite chaque dossier en créant si nécessaire les dossiers A1, A2 etc.. et déplace les fichiers du dossier source vers ces dossiers avec un max de 500 fichiers.

Dis moi si c'est OK !
Bloc de code:
tell application "Finder"
    set grouper to 500
    set lechemin to choose folder with prompt "Sélectionnez le Dossier principal à traiter ?"
    set tous to every folder of contents of lechemin -- entire avec sous dossiers
    set nbdos to count tous
    
    repeat with i from 1 to nbdos
        set chemindossier to item i of tous as string
        set nomdossier to name of item i of tous as string
        set dest to lechemin as string
        set lesfichiers to every file of contents of item i of tous
        set nbfich to count lesfichiers
        
        if nbfich > grouper then
            set numdos to 1
            set nbdeplace to 0
            make new folder at dest with properties {name:(nomdossier & numdos)}
            set destfichier to dest & (nomdossier & numdos) & ":"
            repeat with j from (grouper * numdos) + 1 to nbfich
                
                if nbdeplace = grouper then
                    set numdos to numdos + 1
                    make new folder at dest with properties {name:(nomdossier & numdos)}
                    set destfichier to dest & (nomdossier & numdos) & ":"
                end if
                move item j of lesfichiers to destfichier
                set nbdeplace to nbdeplace + 1
                
            end repeat
        end if
        
    end repeat
    
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: Sunken
Merci beaucoup, je refais un test avec le nouveau script.

Sinon pour les dossiers de 500, dans l'idéal ça serait de faire dans ce cas S1, S2, etc... Après, ça alourdirait peut-être le traîtement car ça induirait une vérification pour savoir si il y a effectivement plus de 500 fichiers pour la lettre "S" (ou autre) avant de créer ce fameur premier dossier S1 (et le cas échéant le dossier S simple).
 
Mince nos post ce son croisés,
je regarde pour modifier et donc supprimer le dossier "S" si plus de 500 fichiers.
 
  • J’aime
Réactions: Sunken
Voila la nouvelle version pour couper les dossiers à 500 fichiers.
Le nom des dossiers commence donc par S1 ...

J'attends ton retour ...

Bloc de code:
tell application "Finder"
    set grouper to 500
    set lechemin to choose folder with prompt "Sélectionnez le Dossier principal à traiter ?"
    set tous to every folder of contents of lechemin -- entire avec sous dossiers
    set nbdos to count tous
 
    repeat with i from 1 to nbdos
        set chemindossier to item i of tous
        set nomdossier to name of item i of tous as string
        set dest to lechemin as string
        set lesfichiers to every file of contents of item i of tous
        set nbfich to count lesfichiers
   
        if nbfich > grouper then
            set numdos to 2
            set nbdeplace to 0
            make new folder at dest with properties {name:(nomdossier & numdos)}
            set destfichier to dest & (nomdossier & numdos) & ":"
            repeat with j from (grouper * (numdos - 1)) + 1 to nbfich
           
                if nbdeplace = grouper then
                    set numdos to numdos + 1
                    set nbdeplace to 0
                    make new folder at dest with properties {name:(nomdossier & numdos)}
                    set destfichier to dest & (nomdossier & numdos) & ":"
                end if
                move item j of lesfichiers to destfichier
                set nbdeplace to nbdeplace + 1
           
            end repeat
            set name of chemindossier to nomdossier & "1"
        end if
   
    end repeat
 
end tell

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

EDIT: erreur corrigée il grouper pas par 500 mais par 2 ! LOL
 
Dernière édition:
  • J’aime
Réactions: Sunken
Je viens de refaire un test avec le précédent script et chose étrange, les fichiers commençant par la lettre A ont été mis dans le dossier # avec les fichiers aux caractères spéciaux et chiffres. En regardant dans le script, je ne vois pas trop ce qui pourrait bloquer.

Pour celui des 500 fichiers, je fais un test et je te redis.

Merci beaucoup!
 
Peut-être le fait de trier par des valeurs ASCII? Après, je ne sais pas si en script on peut demander quelque chose du style "IF l'initiale est une lettre THEN créer dossier lettre ELSE mettre dans dossier #".
 
es fichiers commençant par la lettre A ont été mis dans le dossier #
Effectivement j'avais mis > A donc le A non inclus...
voilà la modif:
Bloc de code:
tell application "Finder"
    
    set lechemin to choose folder with prompt "Sélectionnez le Dossier principal à traiter ?"
    set dest to choose folder with prompt "Sélectionnez le Dossier destinataire ?"
    set chemindest to dest as string
    set tous to every file of entire contents of lechemin
    
    repeat with unfichier in tous
        set lenom to name of unfichier
        set initiale to character 1 of lenom
        set lenum to ASCII number of initiale
        
        if lenum > 64 and lenum < 91 then
        else
            if lenum > 96 and lenum < 123 then
            else
                set initiale to "#"
            end if
        end if
        
        if exists chemindest & initiale then
        else
            make new folder at dest with properties {name:initiale}
        end if
        set chemincopie to chemindest & initiale
        
        move unfichier to chemincopie
        
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: Sunken
Je viens de faire un stress test avec plus de 20000 fichiers et tout fonctionne impec!

Encore un grand merci pour ton aide préciseuse, j'ai appris beaucoup de choses grace à toi!

Et si jamais tu es de passage sur Nancy, n'hésites pas. ça me ferait plaisir de t'offrir un verre pour te remercier!
 
  • J’aime
Réactions: Sly54
Content pour toi !
:up: :coucou:
 
  • J’aime
Réactions: Sunken