Finalisation script BASH besoin d'un peut d'aide

Bonsoir,

J’ai un script qui ce termine de cette facon :

cd $REPERTOIRE_SOURCE for I in * do echo "Redimensionnement de : "$VERT" $I""$NORMAL" convert -filter Cubic -resize $imgsize $I $I done sleep 2 echo "changement des noms de fichier en cour" for i in * do mv $i `echo $i | tr [:upper:] [:lower:]`; done

  1. Mon problème est que le passage de MAJ vers MIN ce fait sur la totallité du nom de fichier, je voudrait que cela ne se fasse que sur l’extension . est-ce possible ?
  2. Je voudrai renommer le fichier de sortie avec la date du jour (incrémentant chaques photos d’un chiffre ex : 13_09_2011_1 ou A-B-C etc…) du traitement, en fin de script, sachant que j’ai cette variable dans mon script :
  1. enfin que tout les fichiers traités, soient transfèrés dans un dossier nomé à la date du jour (le même que celui des fichiers traités mais sans l’incrémentation…)

Ca bouchonne un peut dans ma tête et je vois pas comment procéder, quelqu’un aurait l’amabilité de bien vouloir me dire comment procéder ?

Merci beaucoup.

Bonjour,

2 petites fonctions qui peuvent t’aider.
La première permet de renommer des fichiers avec une racine suivie d’un numéro :

#=========================================
#echo "Renommage des fichiers, nombre de fichiers a traiter : $#"
num=0
(while [ $# -gt 0 ]; do
  type=`echo $1 | cut -f2 -d"."`
  let "compteur += 1"
  num=$(($num+1))
  if [ $num -gt 0 ] && [ $num -lt 10 ]; then # pour les paramètres 1 à 9
    numero=00$num # rajouter 2 digit => 001, 002, 003,..., 009
  fi
  if [ $num -gt 9 ] && [ $num -lt 100 ]; then # pour les paramètres 10 à 99
    numero=0$num # rajouter 1 digit => 010, 011, 012,..., 099
  fi
  if [ $num -gt 100 ] ; then # pour les paramètres supérieur à 100
    numero=$num # ne pas rajouter de digit => 100, 101, 102,...
  fi

  #echo "Renomage de $1 en $NouvNom-$numero.$type"
  mv $1 $NouvNom-$numero.$type
  let "progress = compteur*100/nbfiles"
  echo $progress
  shift
done
) | zenity --progress --auto-close --title="$title"  --text="$msg_renomm" --percentage=0

La deuxieme est utilisée pour l’import de mes photos en les classant dans un dossier en fonction de la date de la photo

function fct_lire_date_exif ()
{ # Lecture de la date de creation de la photo
  #DatePhoto=`jhead $1 | grep Date | awk '{print $3}' | sed "s/:/ /g" `
  DatePhoto=`exiv2 $1 | grep timestamp | awk '{print $4}' | sed "s/:/ /g" `
  if [[ "$DatePhoto" == "" ]]
  then
    echo -e "-I-> Il n'y a pas de date de prise de vue dans $1, utilisation de la date du fichier."
    echo -e "-D-> Creation des donnees Exif minimale et initalisation de la date exif a la date du fichier."
    jhead -mkexif -dsft $1
  fi
  #Repertoire ou doivent être enregistrees les photos
  Annee=`echo $DatePhoto |  awk '{print $1}'`
  Mois=`echo $DatePhoto |  awk '{print $2}'`
  Jour=`echo $DatePhoto |  awk '{print $3}'`
  RepDest=`echo "$RepImages/$Annee/$Annee-$Mois-$Jour"`
  if [[ ! -d $RepDest ]]
  then
    echo -e "\n-I-> Creation du repertoire $RepDest."
    mkdir -p $RepDest
  fi
  #echo "\n-I-> Copie et renommage de $1 "
  echo -e " .\c"
  cp $1 $RepDest/$1
  exiftran -ai $RepDest/$1 # rotation de la photo dans le bon sens
  exiv2 mv $RepDest/$1
}

salut

pourquoi deux boucles for pour traiter les mêmes fichiers ?

Bonjour,
je n’arrive pas à implémenter tes scripts dans le miens ,je ne sais pas ou cela coince…une fenêtre s’ouvre/ferme trop vite…

Merci du CdM.

Voila qui devrait faire l’affaire à la place du code que tu as donné au premier message :

cd "$REPERTOIRE_SOURCE" date="$(date +%d_%m_%Y)" mkdir -p "$date" i=1 for I in * ; do echo "Redimensionnement de : $VERT $I $NORMAL" ext="$(echo ${I##*.} | tr [:upper:] [:lower:])" out="$date/${date}_$i.$ext" while [ -f "$out" ]; do ((++$i)) out="$date/${date}_$i.$ext" done convert -filter Cubic -resize $imgsize $I "$out" ((++$i)) done

C’est dommage d’avoir à utiliser tr, mais il me semble qu’il n’existe pas d’autres moyens.
Juste pour le fun zsh permet de ne pas utiliser tr ainsi :

[quote=“MisterFreez”]
C’est dommage d’avoir à utiliser tr, mais il me semble qu’il n’existe pas d’autres moyens.[/quote]
Si bash >=4 :

$ foo="un petit texte"
$ echo ${foo^}
Un petit texte
$ echo ${foo^^}
UN PETIT TEXTE
$ echo ${foo^^t}
un peTiT TexTe
$ foo="DES MAJUSCULES"
$ echo ${foo,,}
des majuscules

:wink:

for i in {0..150}
do
  printf "%03d\n" $i
done

[quote=“MisterFreez”]Voila qui devrait faire l’affaire à la place du code que tu as donné au premier message :

cd "$REPERTOIRE_SOURCE" date="$(date +%d_%m_%Y)" mkdir -p "$date" i=1 for I in * ; do echo "Redimensionnement de : $VERT $I $NORMAL" ext="$(echo ${I##*.} | tr [:upper:] [:lower:])" out="$date/${date}_$i.$ext" while [ -f "$out" ]; do ((++$i)) out="$date/${date}_$i.$ext" done convert -filter Cubic -resize $imgsize $I "$out" ((++$i)) done

[/quote]

:013 ,desolé, je tourne en rond, il démarre même pas , avec ta modif ! le MKDIR dit qu’il à peux créer le rep car il existe pas … :017 (c’est sûr puis ce que on veut qu’il le créer…) et quand je mmodifie en faisant :

mkdir -p "/mon_rep/test/$date"

il s’arrête.

[quote=“Totor”][quote=“MisterFreez”]
C’est dommage d’avoir à utiliser tr, mais il me semble qu’il n’existe pas d’autres moyens.[/quote]
Si bash >=4 :

$ foo="un petit texte"
$ echo ${foo^}
Un petit texte
$ echo ${foo^^}
UN PETIT TEXTE
$ echo ${foo^^t}
un peTiT TexTe
$ foo="DES MAJUSCULES"
$ echo ${foo,,}
des majuscules

:wink: [/quote]
Nickel même si je trouve que c’est vraiment pas gérable comme syntaxe (vouloir utiliser des caractères autres que des lettres à tout les coups c’est moins lisible et plus limité).

[quote=“chris38”] :013 ,desolé, je tourne en rond, il démarre même pas , avec ta modif ! le MKDIR dit qu’il à peux créer le rep car il existe pas … :017 (c’est sûr puis ce que on veut qu’il le créer…) et quand je mmodifie en faisant :

mkdir -p "/mon_rep/test/$date"

il s’arrête.[/quote]
Ajout un -x dans le shabang pour voir ce qu’il fait.

Pareil, mais voici l’erreur :

Redimensionnement de : SL183106.JPG convert: unable to open image `/_1.jpg': @ error/blob.c/OpenBlob/2489. /home/chris/Documents/Scripts/Img/red_img8.sh: 76: ++1: not found Redimensionnement de : SL183107.JPG convert: unable to open image `/_1.jpg': @ error/blob.c/OpenBlob/2489. /home/chris/Documents/Scripts/Img/red_img8.sh: 76: ++1: not found .......................

Et le sript :

REPERTOIRE_SOURCE="/data/Photos_reduites" rep_absent="!!!!!!!!!!!!!...Attention, Le repertoire source n'éxiste pas ...!!!!!!!!!!!!!" rep_vide="Votre repertoire est vide, ajoutez vos fichiers et renouveler l'opération." DATE=`date +%d%m%y` VERT="\\033[1;32m" NORMAL="\\033[0;39m" ROUGE="\\033[1;31m" JAUNE="\\033[1;33m" echo "Teste de la présence du répertoire ou sont stocké les photos à réduire" echo "Veuillez patienter quelques instant" sleep 2 if [ ! -e "$REPERTOIRE_SOURCE" ] then echo "$ROUGE""$rep_absent" "$NORMAL" sleep 2 echo "Veuillez créer le repertoire suivant : "$VERT""$REPERTOIRE_SOURCE"" "$NORMAL" echo "Fermeture du programme" sleep 2 exit fi echo -n "$BLEU""Nombre de fichiers à traiter" : var=$(ls -a "$REPERTOIRE_SOURCE" | sed -e "/\.$/d" | wc -l) echo "$VERT""$var" sleep 2 if [ $var -eq 0 ] then echo "$ROUGE""$rep_vide""$NORMAL" echo "Fermeture du programme" sleep 5 exit fi title="Choose which sizes to scale to" imgsize=`zenity --title "$title" --list --separator=" " --column="size" "160x120" "320x240" "640x480" "800x600" "1024x768" ` if [ "$?" != 0 ] ; then exit fi #user must select a target size imgsize=`echo $imgsize | sed 's/ max//g'` if [ ! "$imgsize" ]; then zenity --error --title="error" --text="select a target size" exit fi #transforme 640x480 en 640x640 for convert to respect proportions himgsize=$imgsize val1=`echo "$imgsize" | awk -F'x' '{ print $1 }'` imgsize="${val1}x${val1}" echo "$JAUNE""Les photos du répertoire courant : "$VERT" "$REPERTOIRE_SOURCE" "$NORMAL", vont être redimenssionnées aux valeurs suivantes :"$VERT" "$imgsize"""$NORMAL" sleep 2 cd $REPERTOIRE_SOURCE mkdir -p "$date" i=1 for I in * ; do echo "Redimensionnement de : $VERT $I $NORMAL" ext="$(echo ${I##*.} | tr [:upper:] [:lower:])" out="$date/${date}_$i.$ext" while [ -f "$out" ]; do ((++$i)) out="$date/${date}_$i.$ext" done convert -filter Cubic -resize $imgsize $I "$out" ((++$i)) done

Tu as oublié cette ligne avant le mkdir.

Tu as oublié cette ligne avant le mkdir.

[quote=“MisterFreez”]date="$(date +%d_%m_%Y)"
Tu as oublié cette ligne avant le mkdir.[/quote]

Ca tourne en boucle :

Remplace ((++$i)) par i=$((++$i)) d’une part.

D’autre par je ne comprends pas pourquoi il te parle d’un fichier 15_9_2011/15_9_2011_1.15_9_2011.

Ajoute un -x au shebang et envoie-nous ce qu’il te sort.

Le -x au shebang ne renvoie rien !!!

Sa tourne en boucle :

Alors il créer bien le rep avec la date, mais inside ,il n’y a que la première photo qui à été traité … il devrai y en avoir “8”

Tu l’a remplacé que dans le while.

Pour le -x qui marche pas t’utilise quoi comme shell ? Parce que c’est censé fonctionner sous dash, bash et zsh (je pense que ça marche même sous tcsh).

Essaie peut être avec sh -x script.sh.

Idem pour la photo créer dans le rep… et j’utilise bash.
Sa tourne en boucle comme les screens le montre :



Et le script en l’état :

[code]#!/bin/sh
REPERTOIRE_SOURCE="/data/Photos_reduites"
rep_absent="!!!..Attention, Le repertoire source n’éxiste pas …!!!“
rep_vide=“Votre repertoire est vide, ajoutez vos fichiers et renouveler l’opération.“
DATE=date +%d%m%y
VERT=”\033[1;32m"
NORMAL=”\033[0;39m"
ROUGE=”\033[1;31m"
ROSE="\033[1;35m"
BLEU="\033[1;34m"
BLANC="\033[0;02m"
BLANCLAIR="\033[1;08m"
JAUNE="\033[1;33m"
CYAN="\033[1;36m"
echo “Teste de la présence du répertoire ou sont stocké les photos à réduire"
echo “Veuillez patienter quelques instant"
sleep 2
if [ ! -e “$REPERTOIRE_SOURCE” ]
then
echo “$ROUGE””$rep_absent” “$NORMAL"
sleep 2
echo “Veuillez créer le repertoire suivant : “$VERT””$REPERTOIRE_SOURCE”" “$NORMAL"
echo “Fermeture du programme"
sleep 2
exit
fi
echo -n “$BLEU”“Nombre de fichiers à traiter” :
var=$(ls -a “$REPERTOIRE_SOURCE” | sed -e “/.$/d” | wc -l)
echo “$VERT””$var"
sleep 2
if [ $var -eq 0 ]
then
echo “$ROUGE””$rep_vide""$NORMAL"
echo "Fermeture du programme"
sleep 5
exit
fi
###################################
title="Choisissez la résolution d’image souhaité’“
imgsize=zenity --title "$title" --list --separator=" " --column="size" "160x120" "320x240" "640x480" "800x600" "1024x768"
if [ “$?” != 0 ] ; then
exit
fi
#user have to select target size
imgsize=echo $imgsize | sed 's/ max//g'
if [ ! “$imgsize” ]; then
zenity --error --title=“error” --text=“select a target size"
exit
fi
#To respect proportions
himgsize=$imgsize
val1=echo "$imgsize" | awk -F'x' '{ print $1 }'
imgsize=”${val1}x${val1}”
###################################

echo “$JAUNE”“Les photos du répertoire courant : “$VERT” “$REPERTOIRE_SOURCE” “$NORMAL”, vont être redimenssionnées aux valeurs suivantes :”$VERT" “$imgsize”""$NORMAL"
sleep 2
cd “$REPERTOIRE_SOURCE"
date=”$(date +%d_%m_%Y)"
mkdir -p "$date"
i=1
for I in * ; do
echo “Redimensionnement de : $VERT $I $NORMAL"
ext=”$(echo ${I##*.} | tr [:upper:] [:lower:])“
out=”$date/${date}$i.$ext"
while [ -f “$out” ]; do
i=$((++$i))
out="$date/${date}
$i.$ext"
done
convert -filter Cubic -resize $imgsize $I "$out"
i=$((++$i))
done
[/code]

Tu utilise dash :slightly_smiling:

J’ai compris. Tu peux tout résoudre en remplaçant ça :

i=1 for I in * ; do echo "Redimensionnement de : $VERT $I $NORMAL" ext="$(echo ${I##*.} | tr [:upper:] [:lower:])" out="$date/${date}_$i.$ext" while [ -f "$out" ]; do i=$((++$i)) out="$date/${date}_$i.$ext" done convert -filter Cubic -resize $imgsize $I "$out" i=$((++$i)) done
par ça

i=1 for I in *.[jJ][pP][gG] *.[pP][nN][gG] *.[tT][iI][fF][fF] *.[bBmMpP] ; do echo "Redimensionnement de : $VERT $I $NORMAL" ext="$(echo ${I##*.} | tr [:upper:] [:lower:])" out="$date/${date}_$i.$ext" while [ -f "$out" ]; do i=$(expr $i + 1) out="$date/${date}_$i.$ext" done convert -filter Cubic -resize $imgsize $I "$out" i=$(expr $i + 1) done

J’aime pas l’arithmétique en shell, je dois toujours m’y reprendre plusieurs fois pour faire un truc qui marche.

Si Totor (ou quelqu’un d’autre) a mieux qu’il n’hésite pas à donner sa solution, je suis pas inspiré.
Pareil pour le :*.[jJ][pP][gG] *.[pP][nN][gG] *.[tT][iI][fF][fF] *.[bBmMpP]

Juste une petite suggestion pratique concernant le format des dates…

Dû à la façon dont les ordinateurs trient les fichiers et dossiers, il est souvent beaucoup plus facile de retrouver dans une grande liste un fichier/dossier nommé selon un format yyyy-mm-dd plutôt que dd-mm-yyyy. Surtout quand le postulat de départ est, comme souvent, quelque chose du genre « Hmm, ça devait être vers début mai je crois… » :wink:

Moi je ferrais carrément :

[quote=“MisterFreez”]Moi je ferrais carrément :

+1

Sinon, pour rechercher l’indice suivant à utiliser, tout dépend ce que l’on recherche à faire. Ta solution permet de combler les “blancs”.
Si l’on veut trouver le plus grand disponible:

avantages :

  • pas besoin de répéter l’action pour chaque fichier
  • on conserve un ordre chronologique

pour l’histoire des noms de fichier :

printf '%s\n' *.*|egrep -i '\.(jpg|png|tiff|bmp)$'|while read I do ... done

PS : j’aime pas dash…