#1 Le 30/07/2014, à 14:34
- soupaloignon
script avec mv : simplification ?
Bonjour à tous,
J'ai bricolé un petit script qui liste les fichiers présents dans le répertoire et les déplace dans une série de dossiers déjà présents. Tous les fichiers dont le nom commence par un chiffre vont se retrouver dans le dossier 0-9, tous les fichiers commençant par a ou A vont se retrouver dans le dossier A, etc. pour les lettres suivantes de l'alphabet.
for fichier in `ls *`
do
mv 0* 0-9
mv 1* 0-9
# etc pour les autres chiffres
mv a* A* A
mv b* B* B
# etc pour les autres lettres de l'alphabet
done
Le script fonctionne mais j'ai 2 questions :
1/ Je n'ai pas trouvé comment dire à mv de ne pas tenir compte de la casse de la première lettre du nom de fichier. Ca fonctionne avec a* A* mais peut être y a t'il une autre solution ?
2/ Y a t'il une méthode plus simple que faire 27 lignes pour les lettres de l'alphabet ?
Merci d'avance pour vos éléments de réponse
Dernière modification par soupaloignon (Le 30/07/2014, à 14:38)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#2 Le 30/07/2014, à 14:54
- pingouinux
Re : script avec mv : simplification ?
Bonjour,
Question 1 :
shopt -s nocaseglob
Hors ligne
#3 Le 30/07/2014, à 15:30
- Postmortem
Re : script avec mv : simplification ?
Salut,
Quel est l'intérêt de la boucle for alors que tu n'utilises pas la variable fichier après ?
Et concernant cette boucle, ceci :
for fichier in *
Est bien mieux que :
for fichier in `ls *`
Le "ls" ne va faire que t'apporter des soucis.
Une proposition vite fait en bash, en bouclant sur les chiffres et lettres plutôt que sur les fichiers :
shopt -s nocaseglob
for i in {A..Z} {0..9}
do
mv "$i"* "$i"/
done
Par contre, ça fera des erreurs s'il n'y a pas de fichiers commençant par tous les chiffres/lettres.
Édit : correction d'une erreur de syntaxe.
Dernière modification par Postmortem (Le 30/07/2014, à 15:39)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#4 Le 30/07/2014, à 16:25
- soupaloignon
Re : script avec mv : simplification ?
Merci à vous 2 pour les réponses,
>> pingouinux
Je ne connaissais pas "shopt -s nocaseglob". A priori cela rend insensible à la casse toutes les commandes qui viennent après (et jusqu'à la fin du script) ?
>> Postmortem
Quel est l'intérêt de la boucle for alors que tu n'utilises pas la variable fichier après ?
Je n'en sais absolument rien en fait . Plus sérieusement je n'utilise le bash que lorsque j'ai quelque chose à faire, mes connaissances sont donc très limitées. J'avais ce genre de boucle dans un autre script, et ce que j'en ai retenu c'est qu'elle permettait de balayer tout le contenu du répertoire pour y appliquer un traitement. Vu que le besoin était identique, je l'ai repris.
Merci pour ta proposition, que j'ai réadapté car cela ne fonctionnait pas avec les chiffres (un seul répertoire "0-9" contient les fichiers commençant de 0 à 9)
Voilà ce que cela donne pour le moment (cela fonctionne) :
for fichier in *
do
mv 0* 1* 2* 3* 4* 5* 6* 7* 8* 9* 0-9
done
shopt -s nocaseglob
for i in {A..Z}
do
mv "$i"* "$i"/
done
Cela vous parait correct, optimisable ?
Edit :
mv {0..9}* 0-9
remplacera avantageusement (en tout cas en terme de longueur
mv 0* 1* 2* 3* 4* 5* 6* 7* 8* 9* 0-9
Dernière modification par soupaloignon (Le 30/07/2014, à 16:57)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#5 Le 30/07/2014, à 17:02
- pingouinux
Re : script avec mv : simplification ?
Tu peux remplacer toute la première boucle par
mv [0-9]* 0-9/
Cependant, comme te l'a dit Postmortem en #3 pour les lettres, tu auras un message d'erreur si aucun fichier ne commence par un chiffre.
Ou alors, tu peux faire
for i in [0-9]*
do
mv "$i" 0-9/
done
Hors ligne
#6 Le 02/08/2014, à 07:13
- soupaloignon
Re : script avec mv : simplification ?
Salut,
Dsl, je n'avais pas vu ton message.
J'avais édité mon message précédent
Edit :
mv {0..9}* 0-9
remplacera avantageusement (en tout cas en terme de longueur
mv 0* 1* 2* 3* 4* 5* 6* 7* 8* 9* 0-9
E je n'ai pas de messages d'erreurs, sans doute parce que je l'utilise en tant que script nautilus ? (enfin caja puisque je suis sous mate)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#7 Le 02/08/2014, à 07:23
- pingouinux
Re : script avec mv : simplification ?
mv {0..9}* 0-9
E je n'ai pas de messages d'erreurs
Tu n'auras un message d'erreur que si, par exemple, aucun nom de fichier ne commence par 8. S'il existe des fichiers dont le nom commence par chacun des chiffres de 0 à 9, pas de message d'erreur.
Ajouté : À part celui-ci
mv: cannot move `0-9' to a subdirectory of itself, `0-9/0-9'
Dernière modification par pingouinux (Le 02/08/2014, à 07:25)
Hors ligne