Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

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 big_smile. 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

soupaloignon a écrit :

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 ?

soupaloignon #6 a écrit :
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