[script] Renommer un fichier en shell

Autres projets et contributions
Répondre
Link_
Daikyu
Messages : 78
Inscription : lun. 21 avr. 2008, 11:38

[script] Renommer un fichier en shell

Message par Link_ » mer. 10 nov. 2010, 12:24

Hello,
J'ai environ 200 dossiers dans lesquels se trouvent un fichier *.jpg que je voudrais renommer en fichier.jpg.

J'ai donc pensé à faire un petit script shell, seulement j'y connais pas grand chose :P

Voilà ou j'en suis

Code : Tout sélectionner

#!/bin/bash

cd /home/david/musique
ls >> /home/david/liste.txt

first=`head -n1 liste.txt`

	cd "$first"
	#echo `pwd`
A présent il me faudrait faire une sorte de compteur, pour passer à la ligne suivante une fois que l'action #echo `pwd`.
J'ai cherché sur le net, mais j'ai rien trouvé de vraiment facile :/
A chaque fois les codes sont bien trop compliqués, et je veux pouvoir les comprendre, en vue de les adapter à d'autres situations...

Avez vous une idée ?

Merci

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell, demande d'aide

Message par oktoberfest » mer. 10 nov. 2010, 13:09

Salut,

Code : Tout sélectionner

find /home/david/musique -name \\\*.jpg -exec mv {} fichier.jpg \;
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell, demande d'aide

Message par FoolEcho » mer. 10 nov. 2010, 13:30

oktoberfest a écrit :find /home/david/musique -name \\\*.jpg -exec mv {} fichier.jpg \;
Heu... il va te manquer les chemins là, non ? Tout va se retrouver dans un même "fichier.jpg". :?
«The following statement is not true. The previous statement is true.» :nage:

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell, demande d'aide

Message par oktoberfest » mer. 10 nov. 2010, 13:52

Bien vu !

Voilà une autre version :

Code : Tout sélectionner

find . -type d -exec mv {}/'*'.jpg {}/fichier.jpg \;
Ca effectue un mv dans chaque répertoire. Bon ça affiche une erreur si tu n'as pas de *.jpg dans un répertoire... mais sinon ça devrait aller, après un petit test.

Code : Tout sélectionner

$ find .
.
./a
./a/*.jpg
./*.jpg
./a.jpg
./b
$ find . -type d -exec mv {}/'*'.jpg {}/fichier.jpg \;
mv: ne peut évaluer `./b/*.jpg': Aucun fichier ou répertoire de ce type
$ find .
.
./fichier.jpg
./a
./a/fichier.jpg
./a.jpg
./b
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell

Message par FoolEcho » mer. 10 nov. 2010, 14:44

Heu... Tu ne renommes que les '*.jpg', là...
Link_ a écrit :J'ai environ 200 dossiers dans lesquels se trouvent un fichier *.jpg que je voudrais renommer en fichier.jpg.
Ceci dit, je n'ai pas compris si tous ses fichiers s'appelent '*.jpg' (ce qui me paraît un peu bizarre, mais pourquoi pas... et dans ce cas le find devrait marcher), où s'il désigne par là l'ensemble des jpg de son arborescence...
La précision s'impose (pour moi en tous cas :bouletdujour: ).
«The following statement is not true. The previous statement is true.» :nage:

Link_
Daikyu
Messages : 78
Inscription : lun. 21 avr. 2008, 11:38

Re: [script] Renommer un fichier en shell

Message par Link_ » mer. 10 nov. 2010, 15:41

Désolé c'est pas très clair :)
Dans chaque sous dossier, ce trouve un fichier .jpg mais à l'heure actuelle, tous ont des noms différents, je voudrais tous les renommer en fichier.jpg

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell

Message par oktoberfest » mer. 10 nov. 2010, 15:57

Ah ok ! Je croyais que tu avais un fichier qui s'appellait '*'.jpg !

Code : Tout sélectionner

find . -type d -exec bash -c 'mv {}/*.jpg {}/fichier.jpg' \;
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell

Message par FoolEcho » mer. 10 nov. 2010, 16:23

C'est pourquoi j'ai préféré demandé... :copain:

Par contre, rajoute des guillemets, sinon tu auras des problèmes avec les espaces si tu en as dans tes noms de fichiers:

Code : Tout sélectionner

find /home/david/musique -type d -exec bash -c "mv '{}'/*.jpg '{}'/fichier.jpg" \;
( :!: en plus, j'aime pô cette commande, le 'mv' est très vilain... ainsi, si tu as deux images dans le même répertoire, il n'y aura aucune substitution, car il va chercher à te déplacer les images vers un répertoire "fichier.jpg" ... qui n'existe pas, naturellement ! )
«The following statement is not true. The previous statement is true.» :nage:

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell

Message par oktoberfest » mer. 10 nov. 2010, 16:29

C'est sur que en une ligne on ne peut pas tout faire. Et le cahier des charges (si on peut dire) implique qu'il n'y a qu'un fichier jpg par répertoire sinon effectivement le renommage ne peut que poser problème.
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell

Message par FoolEcho » mer. 10 nov. 2010, 16:43

Je préviens juste les catastrophes éventuelles. :chinois:
«The following statement is not true. The previous statement is true.» :nage:

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell

Message par oktoberfest » mer. 10 nov. 2010, 16:50

Tu as bien raison.
En plus ce serait 'mieux' de faire un script avec une boucle et traitement des erreurs et tout et tout, ce serait plus pédagogique que le unlignage.
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell

Message par FoolEcho » mer. 10 nov. 2010, 17:04

Pleinement d'accord, ne serait-ce que le coup de plusieurs fichiers images, histoire de ne pas en paumer.
Bon, après je pense que la commande ne servira qu'une fois...

Sinon, en repartant du '-type f' avec renommage au bon endroit:

Code : Tout sélectionner

find /home/david/musique -name "*.jpg" -exec bash -c "mv \"{}\" \"\`dirname \"{}\"\`/ficher.jpg\"" \; 
(c'est plus pour les histoires de noms de fichiers à la con et de l'usage du exec... ... et parce que ça fait un bail que j'ai plus fait de bash... :lol: elle souffre moins d'erreurs à l'éxécution en cas de répertoires "vides" que la version 'type d', mais est plus brutale puisqu'elle ne garde qu'une image s'il y en a plusieurs :twisted: )
«The following statement is not true. The previous statement is true.» :nage:

Link_
Daikyu
Messages : 78
Inscription : lun. 21 avr. 2008, 11:38

Re: [script] Renommer un fichier en shell

Message par Link_ » jeu. 11 nov. 2010, 12:23

Rebonjour,
Franchement, ou avez vous appris toutes ces choses là :o ? l'utilisation des slash, des antislash, des guillemets, des points çà rend le code incompréhensible pour moi :o

Sinon je viens de calculer une méthode bien plus simple à laquelle je n'avais pas pensé: /home/david/musique/*/*.jpg

Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10517
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [script] Renommer un fichier en shell

Message par FoolEcho » jeu. 11 nov. 2010, 13:47

Pour ma part, de mes études... sous Debian... j'ai fait pas mal de scripts bash.

Ta méthode est plus simple... mais uniquement adapté pour ton type d'arborescence (je suppose que c'est du genre artiste/album avec les couvertures pour chaque album), celle que t'a proposé octoberfest est plus souple et réutilisable car elle ne présuppose pas de l'arborescence. De sa commande, tu peux dériver des scripts pour renommer des fichiers en batterie (en améliorant par exemple pour avoir un système de compteur pour le cas où tu as plusieurs fichiers à un même niveau).

Après pour les commandes, ben... le manuel et l'habitude font qu'on sait ce qu'on peut utiliser. "Au pire", ou si la commande a un intérêt, on peut en faire un script plus élaboré. Et les \ avec ou sans guillemets, ça ne facilite pas la lecture certes, mais c'est pour tenir compte de certaines choses (notamment pour ne pas interrompre la commande bizarrement parce que les variables, c'est-à-dire tes noms de répertoires ou de fichiers, auraient des caractères du genre ' ou " ... exemple: la partie du exec va exécuter le bash compris entre les "", mais si l'un de tes fichiers comprend aussi un ", et bien tu casses ta commande... donc 99.99/100 ça va passer... et tu ne verras que bien plus tard, voire jamais, que certains fichiers ou répertoires n'ont pas été traités).
Mais il n'y a aucun problème à utiliser des trucs plus simples... de toutes manières, le bash c'est des briques de commandes plus ou moins simples à assembler (la syntaxe du 'find' n'est pas des plus simples si on veut tenir compte d'un maximum de choses... à éviter si on débute avec le shell ;-) ).
«The following statement is not true. The previous statement is true.» :nage:

Link_
Daikyu
Messages : 78
Inscription : lun. 21 avr. 2008, 11:38

Re: [script] Renommer un fichier en shell

Message par Link_ » jeu. 11 nov. 2010, 19:16

Merci FoolEcho pour ces précision, merci à tous ceux qui ont proposé leur bout de code également.
Actuellement, je ne suis pas en mesure de les comprendre, mais je ne doute pas qu'ils sont meilleurs que le mien pour les cas particuliers, et qu'ils ont une meilleure adaptabilité ^^

oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [script] Renommer un fichier en shell

Message par oktoberfest » ven. 12 nov. 2010, 08:28

Link_ a écrit :Rebonjour,
Franchement, ou avez vous appris toutes ces choses là :o ? l'utilisation des slash, des antislash, des guillemets, des points çà rend le code incompréhensible pour moi :o
Ca fait 20 ans que je suis sous Unix (avec plus ou moins d'assiduité), et comme UNIX ne change pas à chaque nouvelle version (Petit coucou à Bilou :humour: ) ce qu'on apprend un jour peut être utilisé le lendemain.
Mais je te rassure pas besoin d'attendre 20 ans pour écrire en bash :)

Avec Internet, les man, wiki, how-to et autres FAQ, tu trouveras toujours la réponse à la question que tu te poses. Il faut juste prendre le temps de se poser la bonne question, comprendre les messages d'erreurs et bien lire les docs.
Personnellement je n'ai encore jamais eu à poser une question dans un forum, j'ai toujours trouvé une page web qui me fournissait la réponse.
Comme me disait un professeur de systèmes à la FAQ : "l'important n'est pas de connaitre la réponse, mais de savoir comment la chercher"
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM

Répondre