IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Script pour ranger automatiquement textures


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut Script pour ranger automatiquement textures
    Bonjour à toutes et à tous,

    J'ai quelques milliers de textures à ranger et j'aimerais faire un script afin de ne pas passer plusieurs jours à tout faire manuellement.
    Concrètement, j'ai un dossier, dans lequel toutes mes textures se trouvent (au format jpg png ou tiff).

    Elles sont toutes déjà nommées correctement, par exemple :

    NomDeLaTexture_TYPE_VARIATIONSILYENA_DEFINITION.extension

    Un petit screen pour illustrer le tout :


    Mon but est de les ranger tous de cette manière :

    NomDeLaTexture/DEFINITION/NomDeLaTexture_TYPE_VARIATIONSILYENA_DEFINITION.extension


    Pour le moment j'ai écrit ce bout de code, qui est sensé déplacer les textures dans le dossier de définition (après avoir déplacer les textures dans le dossier portant leur nom), j'espérais ne créer les dossier 1K, 3K,... seulement si des textures de cette définition étaient trouvé, or, même si elle ne sont pas présentent, les dossier sont créé. J'apprends un peu sur le tas du coup je suppose que je n'ai pas dût bien comprendre comment fonctionner les condition sous linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/bin/sh
     
    if find . -name "*512kb.*";
    then
    	mkdir 1K
    	mv $(find *_512kb*) 512kb/
    else
    fi
     
    if find . -name "*1K.*";
    then
    	mkdir 1K
    	mv $(find *_1K*) 1K/
    else
    fi
     
    if find . -name "*3K.*";
    then
    	mkdir 3K
    	mv $(find *_3K*) 3K/
    else
    fi
     
    if find . -name "*6K.*";
    then
    	mkdir 6K
    	mv $(find *_6K*) 6K/
    else
    fi
     
    if find . -name "*HIRES.*";
    then
    	mkdir HIRES
    	mv $(find *_HIRES*) HIRES/
    else
    fi
     
    exit
    Sinon je n'ai pas du tout trouvé comment déplacer dans un dossier portant le nom de la texture, ni même comment rentrer des commandes dans chaque sous dossier.

    Je suis après sensé créer des miniatures de chaque textures puis tout archiver mais ça je peux le faire à la main de manière plus ou moins rapide donc c'est pas dramatique, et je préfère me concentrer juste pour le tri de base des textures déjà que tout ce que je dis est sûrement un peu confus.

    En espérant recevoir de l'aide de votre part, je vous salue !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Bonjour,

    c'est pas compliqué, quand on sait le faire

    • boucler/itérer sur les fichiers du répertoire
    • séparer les composantes du nom du fichier : chemin, texture, type, variation, définition, extension
    • utiliser ces composantes pour
      • créer le répertoire de destination
      • déplacer/copier le fichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    à en croire ton script il faut prendre en compte les variations 512kb, 1K, 3K, 6K et HIRES, on peut alors faire une simple boucle comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for variation in 512kb 1K 3K 6K HIRES; do
       find . -maxdepth 1 -type f -name "*_${variation}*" -exec mv {} ${variation}/ \;
    done
    l'option -maxdepth 1 sert à prévenir find de ne pas descendre dans les sous-répertoires, dans le cas où tous les fichiers sont dans le même répertoire et que les répertoires "variations" sont juste à côté typiquement

    les différentes variations doivent obligatoirement être connues et listées à la main (VARIATIONSILYENA), les fichiers dont le nom ne matchent aucune variation particulière restent alors dans le répertoire courant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ ls -p
    1K/      RoofShinglesOO1_COL_VAR1_HIRES.jpg  RoofShinglesOO1_REFL_1K.jpg      Roofshinglesoo3_GLoss_1K.jpg    RoofShinglesOO4_COL_VAR1_3K.jpg
    3K/      RoofShinglesOO1_COL_VAR2_1K.jpg     RoofShinglesOO1_REFL_3K.jpg      Roofshinglesoo3_GLoss_3K.jpg    RoofShinglesOO4_COL_VAR1_6K.jpg
    512kb/   RoofShinglesOO1_COL_VAR2_3K.jpg     RoofShinglesOO1_REFL_6K.jpg      Roofshinglesoo3_GLoss_6K.jpg    RoofshinglesOO4_COL_VAR1_HIRES.jpg
    6K/      RoofShinglesOO1_COL_VAR2_6K.jpg     RoofShinglesOO1_REFL_HIRES.jpg   RoofShinglesOO3_GLOSS_HIRES.jpg RoofShinglesOO4_COL_VAR2_1K.jpg
    HIRES/   RoofShinglesOO1_COL_VAR2_HIRES.jpg  RoofShinglesOO3_COL_VAR1_1K.jpg  Roofshinglesoo3_NRM_1K.jpg      RoofShinglesOO4_COL_VAR2_3K.jpg
    (...)
     
    $ for variation in 512kb 1K 3K 6K HIRES; do find . -maxdepth 1 -type f -name "*_${variation}*" -exec mv {} ${variation}/ \; ; done
     
    $ ls HIRES/
    RoofShingles001_NRM_HIRES.jpg       RoofShinglesOO1_COL_VAR2_HIRES.jpg  RoofshinglesOO3_COL_VAR1_HIRES.jpg  RoofShinglesOO3_REFL_HIRES.jpg
    RoofShingles003_NRM_HIRES.jpg       RoofShinglesOO1_GLOSS_HIRES.jpg     RoofshinglesOO3_COL_VAR2_HIRES.jpg  RoofshinglesOO4_COL_VAR1_HIRES.jpg
    RoofShinglesOO1_COL_VAR1_HIRES.jpg  RoofShinglesOO1_REFL_HIRES.jpg      RoofShinglesOO3_GLOSS_HIRES.jpg     RoofshinglesOOZ_COL_VAR1_HIRES.jpg

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    à en croire ton script il faut prendre en compte les variations 512kb, 1K, 3K, 6K et HIRES
    mais comment "variabiliser" le processus, c'est-à-dire si on ne connaît pas à l'avance les "définitions" ?
    on boucle sur les fichiers, et cf. mon message précédent.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    mais comment "variabiliser" le processus, c'est-à-dire si on ne connaît pas à l'avance les "définitions" ?
    on boucle sur les fichiers, et cf. mon message précédent.
    ben justement j'en suis pas sûr, vu qu'il parle dans son premier message du format "NomDeLaTexture_TYPE_VARIATIONSILYENA_DEFINITION.extension", ça sous entend que s'il n'y a pas de variation, on risque de récupérer le TYPE ou la DEFINITION à la place, du coup automatiser... c'est peut-être faisable malgré tout, mais je me méfierai un peu des effets de bord je pense

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    s'il n'y a pas de variation, on risque de récupérer le TYPE ou la DEFINITION
    je ne comprends pas.
    la capture d'écran montre un format de noms de fichiers cohérent, auquel il semble possible de se fier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for file in /cheminAbsoluSource/*
       do
          test -f "$file" && {
             nom="${file##*/}"
             IFS='_.' read -a composantes <<<"$nom"
             printf '%s\n' "${composantes[@]}"
             echo "==="
          }
    done
    ...faut voir avec Cuissedemouche...

    Edit :
    ok, j'ai compris. je n'avais effectivement pas vu que parfois il n'y a pas de VARIATION.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    Ouch, faut que je regarde un peu plus ce que vous m'avez envoyé car vous me perdez déjà un peu.

    Du coup oui, parfois il y a VAR1 ou VAR2 (jusqu'à présent je crois que je vais jusqu'à VAR4 mais j'en suis pas sûr), et c'est juste présent sur certaines textures. Dès qu'il n'y a pas de variation de la couleur, cette partie n'est pas présente. Elle n'est pas non plus présente sur certains types de textures quand ce n'est pas utile tel que les glossiness.

    Du coup pour le nom il n'est pas possible de faire un script qui prennent toute la chaîne de caractère jusqu'au premier underscore ? Sachant qu'il n'y a aucun underscore dans les noms, ils ne sont là que pour séparer les composantes.

    D'ailleurs j'ai remarqué que mon script est complètement faussé par le if car si la commande find était bien paramétré, en trouvant un fichier avec 1K il ne créerait que le dossier 1K et pas les autres non ?

    Pour l'architecture, juste pour être sûr qu'on soit tous d'accord je donne cet exemple afin de clarifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    RoofShingles001/
    	1K/
    		RoofShinglesOO1_COL_VAR1_1K.jpg
    		RoofShinglesOO1_COL_VAR2_1K.jpg
    		RoofShinglesOO1_GLOSS_1K.jpg
    		.............
    	3K/
    		RoofShinglesOO1_COL_VAR1_3K.jpg
    		RoofShinglesOO1_COL_VAR2_3K.jpg
    		RoofShinglesOO1_GLOSS_3K.jpg
    		.............
    	6K/
    		.............
    	HIRES/
    		.............
    RoofShingles002/
    	1K/
    ...............................................................

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    ok effectivement j'avais mal compris le besoin, du coup la "variation" peut être présente ou non, mais ça importe peu

    on peut envisager un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for fichier in *; do
       tmp=${fichier##*_}        # on recupere definition+extension genre "1K.jpg"
       definition=${tmp%%.*}     # on ne garde que la definition (on supprime le point et tout ce qui suit)
       texture=${fichier%%_*}    # on supprime le premier underscore et tout ce qui suit (on ne garde que le nom de la texture)
       mkdir -p "${texture}/${definition}/"       # l'option -p permet de ne pas lever d'erreur si le répertoire existe deja
       mv "$fichier" "${texture}/${definition}/"  # et on deplace
    done
    par contre en termes de perfs je sais pas trop ce que ça vaut, sur une poignée de fichiers ça peut aller, sur quelques milliers il faudra peut-être envisager un traitement plus complexe

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ok effectivement j'avais mal compris le besoin, du coup la "variation" peut être présente ou non, mais ça importe peu

    on peut envisager un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for fichier in *; do
       tmp=${fichier##*_}        # on recupere definition+extension genre "1K.jpg"
       definition=${tmp%%.*}     # on ne garde que la definition (on supprime le point et tout ce qui suit)
       texture=${fichier%%_*}    # on supprime le premier underscore et tout ce qui suit (on ne garde que le nom de la texture)
       mkdir -p "${texture}/${definition}/"       # l'option -p permet de ne pas lever d'erreur si le répertoire existe deja
       mv "$fichier" "${texture}/${definition}/"  # et on deplace
    done
    par contre en termes de perfs je sais pas trop ce que ça vaut, sur une poignée de fichiers ça peut aller, sur quelques milliers il faudra peut-être envisager un traitement plus complexe
    Oh mon dieu... Ca marche du feu de dieu... J'ai passé un mois et demi à pratiquement tout faire manuellement avant d'être débordé par le nombre de textures. Ca me sauve la vie !
    Un grand merci !

    PS : Ca fonctionne même très bien sur des milliers de textures, je viens de faire un dossier avec 1024 textures en moins de deux secondes sans soucis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modif d'un script pour demarrage automatiquement
    Par krapoulos dans le forum jQuery
    Réponses: 6
    Dernier message: 17/03/2013, 20h12
  2. Script pour entrer automatiquement un login et mdp
    Par boboss76 dans le forum VBScript
    Réponses: 6
    Dernier message: 16/01/2012, 22h07
  3. script pour suppression automatique
    Par bganata dans le forum VBScript
    Réponses: 5
    Dernier message: 01/04/2010, 09h18
  4. petit script pour vote automatiques
    Par intoxxx dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/11/2009, 13h43
  5. Réponses: 2
    Dernier message: 02/06/2009, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo