Aller au contenu

Bash: Renommer des fichiers + Horodatage image


ChRiiS

Messages recommandés

Salut à tous,

J'avais pas envie de créer un topic pour ça (et c'est pas super mouvementé sur IRC :craint:) alors je me suis dis que le mieux pour trouver quelqu'un, c'était d'aller faire un tour au bar du coin :transpi:

Mais finalement je me suis rendu compte qu'un dimanche même au bar de la banquise, y'a personne ;)

Donc après 3 ou 4 mousses en solitaire à me cailler les miches, j'ai décider de venir ici au chaud :transpi:

Je me lance! En fait j'essaye de faire 2/3 trucs en bash depuis hier, mais je dois avouer que je maitrise pas encore vraiment la bête. Tout d'abords je vous explique le contexte.

J'ai un répertoire qui contient plusieurs fichiers qui ont été "wget-é" depuis un même fichier.

Ils se nomment donc blah.ext, blah.ext.1, blah.ext.2, [....], blah.ext.9, blah.ext.10, blah.ext.11 [...] bref vous connaissez le truc.

Sachant aussi que la suite n'est pas "régulière", j'ai supprimé certains fichier (on peut passer de 11 à 58 par exemple).

Ce que j'aimerais, c'est les renommer en une suite "régulière avec des zéros compensateur" :fume: (je sais que ça doit avoir un nom mais si je le connais il ne me reviens pas :transpi:).

Je m'explique:

  • si la liste va de blah.ext.1 à blah.ext.574 et qu'en tout il y a 412 fichiers, j'aimerais me retrouver avec: blah.ext.001 à blah.ext.412
  • si la liste va de blah.ext.1 à blah.ext.1259 et qu'en tout il y a 17 fichiers, j'aimerais me retrouver avec: blah.ext.01 à blah.ext.17
  • si la liste va de blah.ext.1 à blah.ext.748 et qu'en tout il y a 5 fichiers, j'aimerais me retrouver avec: blah.ext.1 à blah.ext.5

Je suis sur une Gutsy avec gnome (pour info), j'ai testé 2/3 softs type pyRenommer etc... mais mon soucis c'est que les regex c'est pas trop mon truc et que pour les blaireaux comme moi les autres options ne suffisent pas...

Sinon, autre chose ces fichiers sont des jpg de 700*500 (sans exif) et j'aurais voulu savoir si c'était possible d'incruster (en bas à droite genre) le jour et l'heure (jj - xx:xx:xx). J'ai regarder du côté horodatage avec imagemagick mais j'ai pas trouvé grand chose.

Et enfin pour finir j'ai fait un début de script censé se balader dans l'arbo, ça fais le job mais c'est un peu long, et surement fait avec les pieds pour le regard d'un expert. Toujours est-il que si vous pouvez me dire comment l'améliorer je suis preneur sinon encore une fois ça marche c'est déjà ça.

L'arbo à cette gueule là:

|-> Racine
|-----> blah
|---------> 01
|---------> 02
|---------> ...
|---------> XX (inférieur à 16 pour le moment)
|-----> blox
|---------> 01
|---------> 02
|---------> ...
|---------> XX (inférieur à 16 pour le moment)

Et voici mon script:

#!/bin/bash

#On fais un peu de ménage (pour les tests seulements)
clear 

#Sauvegarde du répertoire actuel
chmb=`pwd`
#Designe le répertoire de travail où l'argument $1 est le nom du sous-dossier dans lequel on veut travailler
chm="/Racine/$1/"
#Prépare le répertoire temporaire
chmt=""
#Prépare l'ajoute d'un zéro
zer=0

#Si répertoire de travail existe
if [ -d "$chm" ]; then
#On y va
cd "$chm"

#Retourne le nombre de mots dans une liste des répertoires séparés par un espace (donc retourne le nombre de répertoires)
nbr=`find -maxdepth 1 -type d | wc -w `

#Décrémente le compteur d'un (pour enlever le répertoire ./ du dossier)
let "nbr-=1"

#On commence une boucle de 1 à $nbr
for ((i=01;i<=$nbr;i++)); do 

	#Si $i est plus grand que 10
	if [ "$i" -ge 10 ]; then

		#On enlève le zéro supplémentaire
		zer=""
	#Fin du test sur $i
	fi

	#On formatte le chemin comme il faut
	chmt=$chm$zer$i

	#Si le répertoire temporaire existe
	if [ -d "$chmt" ]; then	
		#On y va
		cd "$chmt"
		#On dit qu'on y est!
		echo "On y est!"
	#Si le répertoire temporaire n'existe pas
	else	
		#On précise qu'on ne le trouve pas
		echo -e "Chemin introuvable"
	#Fin du test sur le répertoire de temporaire
	fi

#On sort de la boucle
done

#Si répertoire de travail n'existe pas
else	
#On précise qu'on ne le trouve pas
echo -e "Chemin introuvable"
#Fin du test sur le répertoire de travail
fi

#On saute une ligne
echo ""
#On retourne au chemin de base
cd "$chmb"

Voili, voilà :transpi: et un grand merci d'avance au(x) courageux qui (est/sont) arrivé(s) au bout (encore plus s'il(s) peu(vent/t) m'aider sur un des points)! :D:incline:

:mdr2:

Lien vers le commentaire
Partager sur d’autres sites

Sinon, autre chose ces fichiers sont des jpg de 700*500 (sans exif) et j'aurais voulu savoir si c'était possible d'incruster (en bas à droite genre) le jour et l'heure (jj - xx:xx:xx). J'ai regarder du côté horodatage avec imagemagick mais j'ai pas trouvé grand chose.
C'est faisable facilement avec imagemagik, je l'ai déjà fait par le passé.

Et enfin pour finir j'ai fait un début de script censé se balader dans l'arbo, ça fais le job mais c'est un peu long, et surement fait avec les pieds pour le regard d'un expert. Toujours est-il que si vous pouvez me dire comment l'améliorer je suis preneur sinon encore une fois ça marche c'est déjà ça.

nbr=`find -maxdepth 1 -type d | wc -w `

#Décrémente le compteur d'un (pour enlever le répertoire ./ du dossier)
let "nbr-=1"

Plus simple :

ls -1 | wc -l

Proposition d'algo :

On part du chemin courant et on appelle la fonction principale :

fonction : 
	pour chaque fichier : 
			si c'est un dossier : 
					on appelle la fonction avec le nouveau dossier:
			sinon (c'est un fichier)
					on compte le nombre de fichier qui on le même patern (on enlève l'extention et on regarde ceux qui ont le même début)
					Calcul du nombre de 0 (ln x / ln 10)
					Renomage du fichier (rename + perl -e pour utiliser sprintf (%nd avec n nombre de 0)
			fin si
	fin pour
fin fonction.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Effectivement theocrite, l'horodatage est relativement simple à mettre en place, ça donne (dans mon cas) quelque chose comme ça:

#on boucle sur toute les images
for i in *jpg*; do
#On récupère le jour
j=`ls -l $i | tr -s ' ' | cut -d' ' -f"6" | cut -d'-' -f"3"`
#On récupère le mois
m=`ls -l $i | tr -s ' ' | cut -d' ' -f"6" | cut -d'-' -f"2"`
#On récupère le heure
h=`ls -l $i | tr -s ' ' | cut -d' ' -f"7"`
#On formatte ça comme on veut
txt=`echo "$j/$m-$h"`
#On lance l'horodatage (attention ici on détruit l'image de base)
convert "$i" -append -gravity SouthEast -pointsize 15 -background black -fill white -draw "text 10,0 '$txt'" "$i"
#On sort de la boucle
done

Encore une fois, ça doit surement être un peu "tordu" mais ça fait le job...

Sinon pour ton idée du "ls -1 | wc -l" le soucis c'est que ça compte aussi les fichiers et pas seulement les répertoires... Je reste sur l'ancienne pour l'instant.

Pour la fonction récursive, par contre, je suis dessus mais je bloque pour compter le nombre de fichier ayant un patern commum...

Mais je lâche pas l'affaire, merci encore à toi :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Sinon pour ton idée du "ls -1 | wc -l" le soucis c'est que ça compte aussi les fichiers et pas seulement les répertoires...
Au temps pour moi, j'avais zappé le "-type d"
Pour la fonction récursive, par contre, je suis dessus mais je bloque pour compter le nombre de fichier ayant un patern commum...
Utilise % pour virer l'extension et ensuite fait un ls -1 ${var}* | wc -l

Ou alors tu stockes dans un tableau et tu regardes la taille.

http://wooledge.org:8000/BashFAQ#head-5b33...d2fae2524351a9c

http://wooledge.org:8000/BashFAQ#head-8eb3...cd140cc6cc6de66

Mais je lâche pas l'affaire, merci encore à toi :dd:
Je t'en prie.
Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...