Script Shell Bash facile : Classer dossiers
Résolu/Fermé
A voir également:
- Script Shell Bash facile : Classer dossiers
- Script vidéo youtube - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
- Ghost script - Télécharger - Polices de caractères
- Shell pause ✓ - Forum Shell
- Script bat - Guide
4 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
2 août 2007 à 23:48
2 août 2007 à 23:48
Salut,
Le script :
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 doneCe 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]$;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
3 août 2007 à 08:29
3 août 2007 à 08:29
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 :
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" :
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 continueQuant à : 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;-))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
3 août 2007 à 12:35
3 août 2007 à 12:35
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;-))
3 août 2007 à 00:17
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 !