IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Création de dossiers automatiquement [Résolu]
Options
Barbackk
posté 1 Jun 2018, 08:28
Message #1


Nouveau Membre


Groupe : Membres
Messages : 10
Inscrit : 18 Dec 2010
Membre no 162 501



Bonjour à tous et à toutes,

je viens vers vous car je ne trouve pas réponse à ma question, et malgré plusieurs essais non concluant j'abandonne..

J'ai un dossier de 4000 images (environ), et je voudrais faire des dossiers de 100 images chacun.
Certes, je pourrais le faire manuellement, c'est un peu long mais pas la mort, mais le problème c'est que j'ai régulièrement ce type de manipulation à faire et un script serais vraiment très pratique..

Seul problème, je ne trouve rien sur Automator pour réaliser ce processus, et en Applescript je suis totalement largué.

Si quelqu'un à une solution à ce problème, je lui en serais grandement reconnaissant smile.gif

En vous remerciant par avance
Go to the top of the page
 
+Quote Post
Guest_anonym_d019ede3_*
posté 1 Jun 2018, 08:34
Message #2





Guests






Bonjour,

Je ne suis pas un pro d'Automator ou d'Applescript mais je sais qu'on peut réaliser ça avec, par contre, il faudrait nous dire comment trier les photos aussi afin de les répartir dans les différents dossiers, ça va renter dans le script et fera gagner du temps à la personne qui passera après moi pour te répondre:

=> Par date ou par tag, noms, extensions…
Go to the top of the page
 
+Quote Post
Barbackk
posté 1 Jun 2018, 13:27
Message #3


Nouveau Membre


Groupe : Membres
Messages : 10
Inscrit : 18 Dec 2010
Membre no 162 501



Salut, merci de ta réponse rapide!

Concernant le rangement, il n'y a pas d'ordre précis (classement dans le finder par noms).
L'idéal serait de créer un dossier de X documents en prenant les premières lignes à chaque fois.

J'espère être assez clair..
Go to the top of the page
 
+Quote Post
teddy7545
posté 2 Jun 2018, 09:38
Message #4


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonjour,

Un petit exemple pour faire ce que tu veux en Applescript.
Le script te demande de choisir le répertoire dans lequel les fichiers se trouvent (il traite tous les fichiers mais ne touche pas les sous répertoires).
Il tri les fichiers (quel que soit leur type : il ne s'occupe pas de savoir si c'est une image ou pas) par nom (un peu plus long mais permet d'avoir un classement logique si les fichiers sont numéroté sinon il opère un classement alphanumérique pas très élégant)
Il crée ensuite un sous répertoire pour chaque groupe de 100 fichiers (modifiable avec la variable filegroup définie en début du script) et y place ensuite les fichiers par groupe de 100
Il s'occupe du reste dans le dernier répertoire quand le nombre de fichier n'est pas un multiple de filegroup.
C'est pas très rapide en parti à cause du tri mais aussi car c'est Applescript qui fait appel au Finder (pourrait être plus rapide avec d'autres méthodes) mais ça fonctionne (testé avec près de 5000 fichiers)
Code
set sortedList to {}
set filegroup to 100
set fileRest to 0
choose folder with prompt "Selectionner le répertoire contenant les fichiers à classer :"
set sourceFolder to result
tell application "Finder"
    try
        set fileCount to (count every file of folder sourceFolder)
        set sortedList to sort (get files of folder sourceFolder) by name
    end try
    if sortedList is not {} then
        if (fileCount mod filegroup) > 0 then set fileRest to 1
        set foldernum to ((fileCount div filegroup) + fileRest)
        repeat with i from 1 to foldernum
            make folder at (sourceFolder) with properties {name:"Dossier_" & i}
            set minFile to (((i - 1) * filegroup) + 1)
            set maxFile to (i * filegroup)
            if maxFile > fileCount then set maxFile to fileCount
            set theFiles to items minFile thru maxFile of sortedList
            move (every item of theFiles) to folder ((sourceFolder as string) & "Dossier_" & i) as alias
        end repeat
    end if
end tell

EDIT : Remplacement de "Répertoire_" par "Dossier_" sur proposition de Baron

Ce message a été modifié par teddy7545 - 3 Jun 2018, 13:13.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Barbackk
posté 2 Jun 2018, 09:59
Message #5


Nouveau Membre


Groupe : Membres
Messages : 10
Inscrit : 18 Dec 2010
Membre no 162 501



Bonjour teddy7545,

je n'ai qu'une chose à dire, MERCI!!
Ton script fonctionne à la perfection!
J'ai tester sur environ 3000 fichiers et tout à parfaitement fonctionné smile.gif
Ce n'est effectivement pas de l'instantané, mais j'ai du mettre environ 30 a 40 secondes pour créer 30 dossiers, ce qui est en soit pas énorme!

Je te remercie énormément, et espère que ça servira à d'autres!

Bonne journée smile.gif
Go to the top of the page
 
+Quote Post
baron
posté 2 Jun 2018, 10:34
Message #6


Macbidouilleur d'Or !
*****

Groupe : Modérateurs
Messages : 19 347
Inscrit : 22 Jul 2004
Lieu : Louvain-la-Neuve (Gaule Gelbique)
Membre no 21 291



Félicitations à teddy7545 pour ses scripts sobres et très pédagogiques ! thumb.gif

J'ajoute juste mon grain de sel pour suggérer de plutôt utiliser dans le script le nom "Dossier_" plutôt que "Répertoire_", qui dans le cas d'un partage de fichiers avec d'autres systèmes pourrait poser plus de difficultés en raison du caractère "é"… wink.gif


--------------------
MacBook Pro 14’’ 2021, M1 Pro, 16 Go/1 To – macOS  12.6 “Monterey”  MacBook Pro 15’’ mi-2010 Core i5 2,53 GHz, 8 Go/SSD Samsung 860EVO 1 To – Mac OSX 10.6.8  Power Macintosh G3 beige de bureau, rev.1 @ 233MHz, 288 Mo/4Go – MacOS 9.1 — + carte PCI IDE/ATA Tempo 66 Acard 6260 avec HD interne Maxtor 80 Go + graveur interne CDRW/DVD LG GCC-4520B + tablette A4 Wacom UD-0608-A + LaCie ElectronBlueIV 19" + HP ScanJet 6100C   B-Box 3 + HP LaserJet 4000 N  
La recherche dans MacBidouille vous paraît obscure ? J'ai rédigé une proposition de FAQ. Le moteur logiciel a un peu changé depuis mais ça peut aider quand même.
Les corsaires mettent en berne…
Go to the top of the page
 
+Quote Post
teddy7545
posté 2 Jun 2018, 10:59
Message #7


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Merci Baron
Concernant les noms, c'est une règle que je m'imposais toujours (il m'en reste encore quelques reste avec les underscore pour éviter les espaces) mais que j'avoue moins suivre depuis que je m'aperçois que sur macOS (et y compris dans le terminal) ç'est généralement bien géré.
Mais tu as raison et je modifie le script pour suivre ton conseil.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
teddy7545
posté 2 Jun 2018, 17:38
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Pour accélérer un peu la vitesse de traitement, il faut passer par exemple par un script shell encapsulé dans applescript ou automator pour faciliter son utilisation et le rendre plus user-friendly.

En commençant à préparer un shell script pour cela, je suis tombé sur ce sujet qui correspondait exactement à ta demande.
J'y ai apporté quelques modifications/simplifications car il comportait quelques problèmes (notamment le tri et la gestion des fichiers restants) et je le propose modifié ci-dessous.

Si tu met le code suivant dans un bloc shell script de Automator (juste précédé par un bloc demander les éléments du finder --> type dossiers ... pour choisir le répertoire à traiter), tu retrouvera le même comportement que le script Applescript mais avec une vitesse améliorée.
Pour ton exemple d'environ 3000 fichiers il met 6,2 s chez moi sur ma machine macpro5.1, environ 16,5 s pour 7000 fichiers et 26 s pour 10000 fichiers
Pour comparaison il m'a demandé 71 s pour 3000 fichiers et 164 s pour 7000 fichiers avec AppleScript (soit un facteur d'environ 10)
Ces valeurs (Applescript) sont légèrement plus basses (53 s et 129 s ) sur le MacBookPro 2017 de ma signature
Probablement encore "optimisable" mais largement assez rapide pour une utilisation même répétée.

Code
DIR=$1
BATCH_SIZE=100
SUBFOLDER_NAME="Dossier_"
COUNTER=1
while [ `find $DIR -maxdepth 1 -type f ! -name ".*" | wc -l` -ge 1 ]
do
  NEW_DIR=$DIR/${SUBFOLDER_NAME}${COUNTER}
  mkdir $NEW_DIR
  find $DIR -maxdepth 1 -type f  ! -name ".*" | sort -V | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR
  let COUNTER++
done
/usr/bin/osascript -e "Display notification \"Traitement terminé\""
Avec une petite notification pour le fun tongue.gif
Pour le fun je vais tester l'autre proposition du lien

Ce message a été modifié par teddy7545 - 3 Jun 2018, 13:57.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
teddy7545
posté 3 Jun 2018, 13:01
Message #9


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Citation
Pour le fun je vais tester l'autre proposition du lien
Comme proposé me revoilà avec une solution complémentaire.
La solution est bien plus complexe et très nettement moins lisible.
J'ai du là aussi comprendre et faire des modifications (correction de problèmes, ajout de tri ...) pour la faire fonctionner correctement.
Malgré quelques petits soucis résiduels sans grande importance (que je vais encore essayer de résoudre), ça fonctionne très bien et en terme de performance c'est bien la plus rapide.

Pour l'utilisation, comme la précédente solution je pars d'un bloc shell script de Automator (juste précédé par un bloc "demander les éléments du finder" --> type dossiers ... pour choisir le répertoire à traiter)
Le comportement est totalement identique aux précédentes solutions (la vitesse en plus)
Attention a ne pas couper les trois lignes du find qui sont en fait une seule et même ligne intégrant l'utilisation d'un sous shell.
Code
DIR=$1
cd $DIR
rm -f ./.counter*
touch ./.counter1

find -s . -maxdepth 1 -type f ! -name ".*" -print0 | sort -zV  | xargs -0 -n 100 sh -c 'n=$(echo ./.counter*); n=${n#./.counter};counter="./.counter$n"; mv "$counter" "./.counter$((n+1))"; mkdir "./Dossier_$n"; mv "$0" "./Dossier_$n"; mv "$@" "./Dossier_$n" '

rm -f $DIR/.counter*
/usr/bin/osascript -e "Display notification \"Traitement terminé\""

Le tri des 7000 fichiers se fait maintenant en seulement 2,2 s cool.gif , les 3000 fichiers en 1,1 s et les 10000 fichiers en 3,2 s ph34r.gif

Ce message a été modifié par teddy7545 - 3 Jun 2018, 13:20.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Barbackk
posté 12 Jun 2018, 17:58
Message #10


Nouveau Membre


Groupe : Membres
Messages : 10
Inscrit : 18 Dec 2010
Membre no 162 501



Salut Teddy!

J'ai essayer de faire fonctionner ton nouveau script mais impossible.

Pour info:
Automator version 2.8
Version iOS 10.13.4 High Sierra

Voici ce que j'ai fais:

Ouvrir Automator et sélectionné "Processus".
Ajouter "Demander des éléments du Finder" -> Ce qui permet d'allez chercher le dossier a classer.
Ajouter "Exécuter un script shell" + ajouter ton dernier script.

J'ai fait copier/coller ça:

DIR=$1
cd $DIR
rm -f ./.counter*
touch ./.counter1

find -s . -maxdepth 1 -type f ! -name ".*" -print0 | sort -zV | xargs -0 -n 100 sh -c 'n=$(echo ./.counter*); n=${n#./.counter};counter="./.counter$n"; mv "$counter" "./.counter$((n+1))"; mkdir "./Dossier_$n"; mv "$0" "./Dossier_$n"; mv "$@" "./Dossier_$n" '

rm -f $DIR/.counter*
/usr/bin/osascript -e "Display notification \"Traitement terminé\""


J'ai laisser la sélection de base du Shell en "/bin/bash".

Quand je lance le processus, il me met "processus terminé" mais aucun classement n'a eu lieu dans le dossier..

As-tu une idée?
Go to the top of the page
 
+Quote Post
teddy7545
posté 12 Jun 2018, 18:17
Message #11


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 879
Inscrit : 4 Apr 2004
Lieu : Lorraine - 54
Membre no 17 184



Bonjour,

Je ne suis pas sur mac en ce moment mais je vais essayer de regarder ce soir ce qui pourrait clocher dans ce que tu as fais.
Tu as surement un problème pour récupérer l'argument $1 au début.
Du coup je ne sais pas ou il a essayé de travailler.
Pour le savoir remplace la ligne DIR=$1 par les lignes suivantes (en laissant les autres lignes en place):
Citation
DIR=$1
echo $DIR
exit
echo permet juste de lire la variable qui a été récupérée
exit termine le script sans exécuter la suite
Lance le script et regarde ce qui est inscrit dans result (note le répertoire dans lequel à priori il a dû tenter de faire quelque chose)

Pour corriger je pense qu'il faut modifier le comportement de input
Quand tu ajoutes Shell Script Action sélectionne Shell à /bin/bash et à droite Pass input:
as arguments
--> ca doit permettre de récupérer correctement ta variable

Refais le test cette fois en ayant fait la modification indiquée ci dessus.
Si ton script indique maintenant bien le bon chemin du dossier à traiter tu peux supprimer les deux ligne echo et exit et tester si le classement fonctionne

Chez moi, j'ai testé sur Sierra et High Sierra sans aucun problème.
Le script te demande t'il bien de choisir un répertoire ?

Sinon as tu essayé la version juste avant qui est basée sur la même construcion Automator.
Normalement il suffit de remplacer le script shell en gardant exactement les mêmes blocs.
De la même façon il est nécessaire d'envoyer les input en tant qu'arguments.

Ce message a été modifié par teddy7545 - 12 Jun 2018, 18:41.


--------------------
MP Intel Dual Xéon 3 GHz - MacOSX 10.10.3 - ATI Radeon HD 5770 - ATTO UL5D - Apple Cinema HD Display 23 pouces
MBP 15' 2017 - MBP 13' mid 2009 - iMac 24' 8,1 2,8GHz - MP G4 MDD Bi 1,25 GHz - MP G4 Quicksylver 933MHz
Go to the top of the page
 
+Quote Post
Barbackk
posté 13 Jun 2018, 01:48
Message #12


Nouveau Membre


Groupe : Membres
Messages : 10
Inscrit : 18 Dec 2010
Membre no 162 501



Salut Teddy,

J'ai testé ce que tu m'as dis avec echo et exit, et je suis sur "bin/bash" et à droite sur "comme arguments".
En résultats, il m'indique le chemin pour accéder au dossier que je souhaite traiter.

En retirant les lignes echo et exit, le processus semble avoir lieu, mais aucun rangement n'est effectué..
Le script (ou automator) ouvre une fenêtre pour que je choisisse le dossier à trier, je sélectionne le dossier et je valide sur "choisir".
Le petit son qui indique que le processus est terminé + message en haut à droit qui indique " Editeur de scipt Traitement terminé".

Comme je le disais précédemment, pas besoin de se prendre la tête la dessus, pour moi le processus sous Script est efficace.
Je voulais tester afin d'aider un futur utilisateur, mais pas de stress smile.gif


J'ai un dossier de 3588 photos, je me suis dis que le fait que le chiffre ne soit pas rond pouvais problème, j'ai donc supprimer 88 photos pour arrivé à 3500.
Après test, ce n'est toujours pas ça!

Et oui j'ai tester avec la première proposition, rien y fait!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 19th April 2024 - 21:00