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 24/03/2008, à 14:06

slhuilli

[BASH] Aide

Bonjour,

je voudrais monter un script (équivalent .bat dos) mais j'y connais absolument rien pour le moment. Mon but est d'apprendre un peu le shell et de comprendre, pour m'en resservir (faut bien commencer par un bout). Alors autant me faire un truc utile.
J'ai un répertoire bourré de fichiers qui ont tous la même structure de nom :
(theme) - (titre).extension, sans les parenthèses évidemment

Mon but étant de "classer" c'est a dire ranger les fichiers selon le thème (un répertoire par thème, le theme peut etre une chained e caractere avevc espaces, il est défiunit par tout ce qui précéde le premier tiret du nom de fichier)., sachant que ce répertoire a déjà pu être créé auparavant ou pas

Exemple

1. Je fais un ls, j'obtiens

theme - Mon fichier1.txt
mon theme2 - Mon fichier2.txt

dans le script, il faut que je vire les espaces (obligatoire) et que je les remplace par _
J'ai trouvé ca :

for i in *\ *; do 
	$source=echo $i |tr " " "_";
	mv -T "$i" $source;
done

qui a l'air de marcher mais je sèche a partir de là !
2. j'obtiens donc :


theme_-_Mon_fichier1.txt
mon_theme2_-_Mon_fichier2.txt

il faudrait maintenant déplacer le fichier en fonction de ce qui est avant le premier tiret du nom de fichier (ici : theme_ , mon_theme2_) dans les répertoires theme, mon theme2, et, tant qu'a faire, remplacer cette fois ci les _ par " "pour que les noms de fichiers soient propres...


et là je sèche ....

Hors ligne

#2 Le 24/03/2008, à 15:29

Alain.g

Re : [BASH] Aide

Salut

Je ne comprends pas pourquoi tu dis qu'il est obligatoire de supprimer les espaces puisque à la fin tu veux les remettre ?
Si tu crains que ça pose problème de le script, il n'y aura pas de problème du moment que tu utilises bien les guillemets.

Pour ce que tu souhaites, il y a toutes les informations ici : http://abs.traduc.org/abs-4.2.01-fr/ch09s02.html#substringremoval
précisément :

${chaine%%souschaine}

    Supprime la plus grande correspondance de $souschaine à partir de la fin de $chaine.

Donc si i="mon theme2 - Mon fichier2.txt" , "${i%% -*}" sera égal à "mon theme2"
(ou "${i%%_-*}" si tu as supprimé les espaces)

À partir de là on peut créer notre dossier avec "mkdir -p" (-p pour éviter un message d'erreur si le dossier existe) et on déplace avec mv

for i in *.txt ; do d="${i%% -*}" ; mkdir -p "$d" ; mv "$i" -t "$d" ; done

En remplaçant le "${i%% -*}" par "${i%%_-*}" si tu as déjà remplacé les espaces par _ dans les noms.

Précision : "%% -*" supprime le premier " -" et tout ce qu'il y a derrière. J'ai supposé qu'il y avait toujours un espace avant le tiret, sinon il faudra adapter.

Sinon pour remplacer les espaces (ou les remettre), il est plus simple d'utiliser "rename", sans même faire de boucle :

rename 'y/ /_/' *

Dernière modification par Alain.g (Le 24/03/2008, à 15:59)


Xubuntu Karmic !

Hors ligne