Script Shell Bash facile : Classer dossiers [Résolu/Fermé]

Signaler
-
 Mars -
Bonjour,
En gros je veux classer des dossiers de photos par année sachant que les dossiers sont de la forme "2006 05 03 - Corse"
Voilà mon problème je voudrai en shell sous linux réaliser un script qui regarde dans un dossier (/tmp par ex) les dossiers de photo et les ranges dans des sous dossiers d'années.
Exemple : ls /tmp
2006
2006 05 03 - Corse
2006 06 06 - Marseille
2007
2007 01 02 - Paris
2008 01 01 - pas encore

Une fois le script passé il resterait
2006
2007
2008
Car les dossiers se seraient rangés dans leurs années respectives (petit + le dossier 2008 est créé car le script remarque qu'il n'existe pas)

Merci beaucoup car la dev c'est vraiment pas pour moi !!!

4 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Salut,

Le script :
#! /bin/bash

for name in *
do
if test -d "$name"
        then continue
        elif
                test "$name" = ${0#./*}
        then continue
        else
                annee=$(echo ${name%% *})
                if test ! -d ${annee}
                then
                        echo "Création du répertoire ${annee}"
                        mkdir ${annee}
                fi
        echo "Déplacement du fichier ${name} dans le répertoire ${annee}"
        mv "${name}" "${annee}/${name}"
fi
done
Ce qui donne :
[jp@MDK tmpfs]$ ls

total 4
drwxrwxr-x  2 jp jp 40 aoû  2 22:31 2006/
-rw-rw-r--  1 jp jp  0 aoû  2 22:32 2006 05 03 - Corse
-rw-rw-r--  1 jp jp  0 aoû  2 22:32 2006 06 06 - Marseille
drwxrwxr-x  2 jp jp 40 aoû  2 22:31 2007/
-rw-rw-r--  1 jp jp  0 aoû  2 22:32 2007 01 02 - Paris
-rw-rw-r--  1 jp jp  0 aoû  2 22:32 2008 01 01 - pas encore
-rwxrwxr-x  1 jp jp 355 aoû  2 23:40 foo.sh*

[jp@MDK tmpfs]$ tree

.
|-- 2006
|-- 2006 05 03 - Corse
|-- 2006 06 06 - Marseille
|-- 2007
|-- 2007 01 02 - Paris
|-- 2008 01 01 - pas encore
`-- foo.sh

2 directories, 5 files

[jp@MDK tmpfs]$ ./foo.sh

Déplacement du fichier 2006 05 03 - Corse dans le répertoire 2006
Déplacement du fichier 2006 06 06 - Marseille dans le répertoire 2006
Déplacement du fichier 2007 01 02 - Paris dans le répertoire 2007
Création du répertoire 2008
Déplacement du fichier 2008 01 01 - pas encore dans le répertoire 2008

[jp@MDK tmpfs]$ ls -l

total 4
drwxrwxr-x  2 jp jp  80 aoû  2 23:40 2006/
drwxrwxr-x  2 jp jp  60 aoû  2 23:40 2007/
drwxrwxr-x  2 jp jp  60 aoû  2 23:40 2008/
-rwxrwxr-x  1 jp jp 355 aoû  2 23:40 foo.sh*

[jp@MDK tmpfs]$ tree

.
|-- 2006
|   |-- 2006 05 03 - Corse
|   `-- 2006 06 06 - Marseille
|-- 2007
|   `-- 2007 01 02 - Paris
|-- 2008
|   `-- 2008 01 01 - pas encore
`-- foo.sh

3 directories, 5 files

[jp@MDK tmpfs]$
;-))
Bonsoir, je vais me coucher donc excuse moi si je ne te donne plus de nouvelles ensuite...

Tout d'abord bravo (chez moi ça ne fonctionne pas encore mais je pense que ce sont des détails) pour le raisonnement car je suis malgré moi bien incapable de pondre du code même si je peux parfois le lire...
En l'occurrence chez moi il ne se passe rien quand je passe le script, alors je pense que ton algo est bon mais j'ai oublié quelques précisions peut-être : les "2007 01 02 - Paris" et autre ne sont pas des fichiers mais des dossiers déjà contenant des photos.
A part ça je ne vois pas trop, je ne comprends pas certaines choses car pas habitué à l'ecriture ou à la syntaxe alors si tu pouvais répondre à ma curiosité ce serait sympa !
test "$name" = ${0#./*} Peux-tu me le traduire ? Tu vérifie que name est égal à quoi ?

annee=$(echo ${name%% *}) : à quoi servent les %% * ????

Bon eh bien merci pour ta patience si tu as une idée et des réponses !!!

Bonne nuit !
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Re-

mais j'ai oublié quelques précisions peut-être : les "2007 01 02 - Paris" et autre ne sont pas des fichiers mais des dossiers
Détail qui a son importance déjà ne serait-ce que pour le 1ère condition ;-\
if test -d "$name"
à remplacer par un test sur la longueur de la chaîne :
if [ ${#name} = 4 ];then continue
Quant à : test "$name" = ${0#./*} il faut savoir que le paramètre "$0" dans un script contient comme valeur le nom du script lui même. Ensuite concernant l'expansion des variables, les opérateurs "#" et "%" permettent de remplacer le contenu d'une variable en supprimant le début ou la fin de la chaîne contenu dans cette variable.

Dans ton cas (enfin le mien), je voulais éviter que le script ne prenne en compte le script lui même (étant donné qu'il était lancé depuis le même répertoire où se trouvent les dossiers et fichiers à traiter), et comme le script (exécutable) est lancé avec "./" (./le_script) devant son nom, la variable $0 contient donc la valeur "./le_script", il faut donc extraire le "./" et ce que fait l'expression "#./*" à l'intérieur des parenthèses.

Idem pour "${name%% *}", les "%%" permettent de supprimer la plus grande occurrence en fin de chaîne, autrement dit sur une chaîne comme "2006 05 03 - Corse" on élimine " 05 03 - Corse" :
$ var="2006 05 03 - Corse"

$ echo ${var%% *}     # Supprime la plus grande occurrence de la chaîne en fin
2006

$ echo ${var% *}     # Supprime la plus petite occurrence de la chaîne en fin
2006 05 03 -

$ echo ${var#* }     # Supprime la plus petite occurrence de la chaîne en début
05 03 - Corse

$ echo ${var##* }     # Supprime la plus grande occurrence de la chaîne en début
Corse
;-))
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Tiens ça devrait le faire
#! /bin/bash

for name in *
do
if test ! -d "$name"
        then continue
        elif
        [ ${#name} = 4 ]
        then continue
        else
                annee=$(echo ${name%% *})
                if test ! -d ${annee}
                then
                        echo "Création du répertoire ${annee}"
                        mkdir ${annee}
                fi
        echo "Déplacement du répertoire ${name} dans le répertoire ${annee}"
        mv "${name}" "${annee}/"
fi
done
;-))
Tout fonctionne sur des roulettes, c'est parfait, les explications sont bonnes puisque je les ai comprises, en gros merci !