#26 Le 29/12/2010, à 13:37
- Levi59
Re : Script Schell exercice je ne comprend rien
j'ai fait une petite mise à jour de ma version du script car en testant j'ai remarqué que getops ne faisait pas la différence entre une mauvaise option et une absence d'argument pour une option (il renvoi toujours "?").
Confère mon blog en signature
Hors ligne
#27 Le 29/12/2010, à 14:53
- Totor
Re : Script Schell exercice je ne comprend rien
j'ai fait une petite mise à jour de ma version du script car en testant j'ai remarqué que getops ne faisait pas la différence entre une mauvaise option et une absence d'argument pour une option (il renvoi toujours "?").
Faux : tu ne l'utilises pas correctement. cf un de mes scripts ou encore ici
-- Lucid Lynx --
Hors ligne
#28 Le 29/12/2010, à 16:15
- ehmicky
Re : Script Schell exercice je ne comprend rien
Il faut mettre un ":" au début, par exemple :
while getopts ":abc" VAR
do
case "$VAR" in
a)
...
\?)
echo "Invalid argument" >&2
exit 1 ;;
:)
echo "Missing argument" >&2
exit 2 ;;
esac
done
shift $(( OPTIND - 1 ))
Dernière modification par ehmicky (Le 29/12/2010, à 16:17)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#29 Le 29/12/2010, à 16:15
- Levi59
Re : Script Schell exercice je ne comprend rien
Il m'a fallut 5 bonnes minutes pour aligner de quelle erreur tu parlais...
Tu peux m'expliquer en diagonal pour les ":" ?
J'ai compris qu'il indiquent l'obligation d'un argument pour une option si il se trouve après cette option mais pourquoi en mettre un en premier?
J'actualise sur mon blog...
Edit:
@ ehmicky
Merci, j'ai trouvé ^^
Dernière modification par Levi59 (Le 29/12/2010, à 16:21)
Hors ligne
#30 Le 29/12/2010, à 16:21
- Tutux80
Re : Script Schell exercice je ne comprend rien
Alors,
Pour savoir la dernière modification en secondes depuis l'epoch
echo " Derniere modification faite le $(stat -c %X $1)"
Mais la sa me le fait sur le dossier il faut que j'arrive a faire sa sur toutes les images contenues dans le dossier ?
Par contre comment je fait pour mettre des codes d'erreur egale a 1 , 2 , 3 ou 4 ?
Et l'existence et type du fichier, c'ets vérifier si il y a des images qui sont bien au format .jpg dans le dossier ?
Dernière modification par Tutux80 (Le 29/12/2010, à 16:23)
Hors ligne
#31 Le 29/12/2010, à 16:23
- ehmicky
Re : Script Schell exercice je ne comprend rien
Quand c'est après une lettre, ça signifie qu'il faut mettre obligatoirement un argument pour cette option. Cependant, s'il y a un ":" tout au début de la liste (ici ":abc"), cela signifie que l'on entre en mode silent (par opposition à verbose, par défaut).
La différence :
- pas de message d'erreurs
- ":" est stocké en cas d'argument manquant et non "?"
- OPTARG, plutôt que d'être initialisé avec une null string (mode verbose), est initialisé avec l'option invalide en cas d'option invalide, ou avec l'option dont il manque un argument.
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#32 Le 29/12/2010, à 16:35
- Levi59
Re : Script Schell exercice je ne comprend rien
@ ehmicky
OK! Merci beaucoup de cet éclaircissement! C'est vrai que l'utilisation de cette "option" rend le script plus clair et fonctionnel.
Alors,
Pour savoir la dernière modification en secondes depuis l'epochecho " Derniere modification faite le $(stat -c %X $1)"
Mais la sa me le fait sur le dossier il faut que j'arrive a faire sa sur toutes les images contenues dans le dossier ?
"man stat" en console te donneras toutes les infos
(tu peux aussi le faire sur google pour trouver des sites en francais)
Par contre comment je fait pour mettre des codes d'erreur egale a 1 , 2 , 3 ou 4 ?
Et l'existence et type du fichier, c'ets vérifier si il y a des images qui sont bien au format .jpg dans le dossier ?
"exit x" avec x correspondant à ton erreur
Pour l'existence et le type, j'ai comme Totor juste récupéré les images en .jpg (Personnellement, je me suis arrangé pour récupérer aussi les images Jpg ou jPg... En gros j'ignore la casse)
Mais il doit etre possible
Edit :
Ne le prend pas pour toi Tutux80 mais si tu décides de reprendre tout ou partie de mon script (ce qui n'est pas une bonne idée!), sache que j'ai volontairement laissé 1-2 erreur(s)... (Il y en a une grosse facile à trouver mais un peu moins à régler à ton niveau ^^)
Mais n'hésite pas à proposer une solution si tu trouves.
Dernière modification par Levi59 (Le 29/12/2010, à 17:10)
Hors ligne
#33 Le 29/12/2010, à 16:48
- Totor
Re : Script Schell exercice je ne comprend rien
@Levi59:
Je viens de regarder ton script. Je te propose de regarder ce fil
-- Lucid Lynx --
Hors ligne
#34 Le 29/12/2010, à 17:04
- Levi59
Re : Script Schell exercice je ne comprend rien
J'ai lu l'entièreté du fil et je n'ai pas compris (honte à moi) le problème à utiliser find pour rechercher les fichier ou du moins, si il y a, l'erreur dans ma commande.
Hors ligne
#35 Le 29/12/2010, à 17:35
- Tutux80
Re : Script Schell exercice je ne comprend rien
Ne le prend pas pour toi Tutux80 mais si tu décides de reprendre tout ou partie de mon script (ce qui n'est pas une bonne idée!), sache que j'ai volontairement laissé 1-2 erreur(s)... (Il y en a une grosse facile à trouver mais un peu moins à régler à ton niveau ^^)
Mais n'hésite pas à proposer une solution si tu trouves.
Ne t'inquiete pas premierement je ne sais pas ou est ton script, mais de toute manière j'aimerais réussir a le faire moi même, déjà pour pouvoir être fier de moi malgré l'aide que vous m'avez déjà apporté, mais aussi pour comprendre et que cela puisse m'aider aux prochains devoir que j'aurai dans cette matière.
Je t'avoue par contre que si je n'arrive pas à finir avant la fin des vacances ( ces vacances la c'est pas super pour travailler :s, je fait de mon mieux ), je regarderai sur le tien
Merci du conseil et de ton aide (:
Edit:
Ok je l'ai trouvé mais je ne comprend rien, je n'ai pas les memes notations on dirait, je sais pas mais y'a beaucoup de symbole, et tout qu je ne connait pas, ce n'est pas du tout mon niveau
Dernière modification par Tutux80 (Le 29/12/2010, à 17:38)
Hors ligne
#36 Le 29/12/2010, à 18:05
- ehmicky
Re : Script Schell exercice je ne comprend rien
Tu devrais poster l'avancée des travaux.
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#37 Le 29/12/2010, à 18:52
- Totor
Re : Script Schell exercice je ne comprend rien
J'ai lu l'entièreté du fil et je n'ai pas compris (honte à moi) le problème à utiliser find pour rechercher les fichier ou du moins, si il y a, l'erreur dans ma commande.
en gros, il n'y a aucun intérêt à utiliser find dans ton script car bash sait très bien le faire lui même... ni même à utiliser un fichier temporaire...
Dernière modification par Totor (Le 29/12/2010, à 18:54)
-- Lucid Lynx --
Hors ligne
#38 Le 29/12/2010, à 21:03
- Levi59
Re : Script Schell exercice je ne comprend rien
Ok pour le fichier temporaire. J'ai utilisé cette solution par depit car je ne trouvais pas de méthode simple...
Je vais essayer de réécrire quelque chose. ^^
@ Tutux80
Si tu as des questions sur mon code, n'hésite pas! À partir du moment où tu comprends une écriture et que tu es capable de t'en servir, rien ne t'empèche de t'en servir. ;-)
Hors ligne
#39 Le 29/12/2010, à 21:37
- Tutux80
Re : Script Schell exercice je ne comprend rien
#!/bin/bash
# test nombres d'arguments
if ! (( "$#" == 2 ))
then
echo "Nombres d'arguments invalide"
exit 1
fi
# séparer date
echo $2
jour=$(echo $2 | cut -c5,6)
mois=$(echo $2 | cut -c3,4)
annee=$(echo $2 | cut -c1,2)
# Verification date
if (($mois>12 || $mois<=0))
then echo "format non valide"
exit 4
else
echo "ok"
fi
if (($jour>31 || $jour<=0))
then
echo "format non valide"
exit 4
else
echo "ok"
fi
# epoch
echo "Depuis votre date $(date -d $2 '+%s') secondes se sont écoulées"
# Derniere modification
for all in $1
if
then
do
echo "$(stat -c %X )"
done
exit 0
done
else
exit 0
# Vérifier droits répertoire
if test -d $1 && test -w $1
then
echo "$1 droits ok"
else
echo "$1 droits non ok"
exit 3
fi
# Comparer date
Voila, je sais il y a beaucoup de vide dans la partie "Dernière modification", j'ai passé une demi heure à essayé de le remplir, pour l'instant je n'arrive pas, mais avant de reprendre, pourriez vous me dire si c'est faisable comme sa ou si je me casse la tête pour rien...
Voila ce que j'essaie de faire
Pour tout les fichiers du dossier contenu dans la variable $1
si ce sont des fichier .jpg alors
afficher en secondes le temps passé depuis l'Epoch
Hors ligne
#40 Le 29/12/2010, à 22:12
- ehmicky
Re : Script Schell exercice je ne comprend rien
jour=$(echo $2 | cut -c5,6) mois=$(echo $2 | cut -c3,4) annee=$(echo $2 | cut -c1,2)
Franchement c'est vraiment pas orthodoxe ça, tu peux à la rigueur faire :
jour="$(cut -c5,6 <<<"$2")"
si tu tiens absolument à parser la date avec cut, mais il me semble que la meilleure solution reste d'utiliser date, comme indiqué dans mon précédent post. En parsant toi-même, tu t'exposes à ce que des gens mettent une date paraissant valide, mais ne l'étant pas, par exemple sous le format ddmmYY, alors que tu veux YYmmdd. date rep{é,a}rera une partie de ces erreurs.
Sinon, tous les echos renvoyant des infos de débuggage ne seront peut-être pas souhaitées par ton prof dans la version finale.
Dernière modification par ehmicky (Le 29/12/2010, à 22:15)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#41 Le 29/12/2010, à 23:25
- Levi59
Re : Script Schell exercice je ne comprend rien
J'ai mis à jour mon script selon les recommandations de Totor... Est-ce mieux professeur? ^^
Edit: J'ai aussi rajouté une option pour ne pas intervenir si le fichier a déjà été convertie (réduction des écritures pour disques SSD)
@Tutux80
Je rejoint ehmicky, toujours faire simple!
date te permet de vérifier le format tout en formatant en seconde le tout en une ligne, bien sûr, il te faut un test pour vérifier si il y a une erreur mais celui ci peux tenir également sur une ligne.
Bien sûr, c'est pas fini mais attention sur la partie date de modification:
tu utilises stat sans préciser de fichier,
"if" n'est pas fermer par "fi",
pas de test,
tu as mis des exit 0 partout... (exit 0 indique d'arrêter un script sans déclarer d'erreur, soit code 0)
Dernière modification par Levi59 (Le 30/12/2010, à 00:10)
Hors ligne
#42 Le 30/12/2010, à 10:41
- Tutux80
Re : Script Schell exercice je ne comprend rien
J'essai de terminer ça aujourd'hui, je m'y met tout de suite (:
PS je vous ait envoyé un message Levi59 sur votre blog (:
Hors ligne
#43 Le 30/12/2010, à 11:25
- Tutux80
Re : Script Schell exercice je ne comprend rien
for all in $1
if test #*. = jpg
then
do
echo "$(stat -c %X )"
done
fi
J'ai un petit probeleme, la je test sur rien, je voulais mettre
if test i#. = jpg
Mais il faudrait que je change le "all" mais je ne sait pas par quoi le remplacer...
Hors ligne
#44 Le 30/12/2010, à 13:09
- Levi59
Re : Script Schell exercice je ne comprend rien
Alors je vois déjà 2-3 trucs
= On ne chevauche jamais les commande: for...if...do...done...fi => for...do...if...fi...done
= Syntaxe for...do...done
Si tu te réfère à la documentation, tu verras que la structure est celle-ci:
for variable in (motif ou ensemble)
-variable est une nouvelle variable qui va accueillir chaque correspondance avec le (motif ou ensemble), pour toi c'est all, mais ca peut avoir presque n'importe quel nom.
-le (motif ou ensemble) est soit une pattern comme *.jpg (qui veut dire tous les fichiers se terminant par .jpg) ou un ensemble comme une variable (ici $1 qui contient un dossier) ou plusieurs valeurs ( a b c d )
Dans ton cas, il faut utiliser stat avec ${all} comme argument et il ne faut pas utiliser le dossier mais les éléments qui s'y trouve...
= le test
pour comparer des variables texte, on les met entre guillemets "jpg" et pour #*. il faut l'utiliser sur une variable:
var="unevariablecontenant.fichier.tar" ; "${var##*.}" correspond à "tar"
Dernière modification par Levi59 (Le 30/12/2010, à 13:09)
Hors ligne
#45 Le 30/12/2010, à 13:16
- Tutux80
Re : Script Schell exercice je ne comprend rien
Je suis completement perdu la, donc la c'est possible ou pas de tout faire dans un seul bloque ou vaudrait-il mieux que je fasse en plusieurs ?
Même si ce n'est pas optimisé, pour le moment j'essaie de le faire "au plus simple" juste que sa fonctionne
Hors ligne
#46 Le 30/12/2010, à 13:36
- Levi59
Re : Script Schell exercice je ne comprend rien
Comme je te l'est dit par mail, le plus simple est de faire un plan sur papier de ce qui doit être fait et dans quel ordre en gardant à l'esprit comment tu peux le faire, c'est à dire que si tu ne sais pas comment faire 2-3 choses en même temps, alors fait les une à une.
Ensuite tu tapes une première version en suivant ton plan et tu tests.
Si ca plante, tu cherche l'erreur, sinon tu cherches à provoquer l'erreur (ne précise pas de date, met un nom de fichier au lieu de dossier...).
Si en mettant une date fantaisiste, tu n'as pas d'erreur par exemple, c'est qu'il y a un problème et donc là aussi, tu corriges.
Si tu arrive à ce niveau, tu peux alors essayer d'optimiser ton code mais ne cherche pas, à ton niveau actuel, la perfection dans chacune de tes commande car sinon tu n'en finiras jamais...
Ici le code que tu as écrit ne te servirait à rien dans l'optique de l'exercice mis à part à comprendre la commande.
Je vais te donner un aperçu de ce bloc dans ton script: remplacer les block {} par le vrai code
{se placer dans le dossier indiqué}
for unevaribleaveclenomquetuveux in {les fichiers .jpg}
do
if test "$(stat -c %X ${unevaribleaveclenomquetuveux})" {est plus/moins grand que} "{date donné en argument au format epoch}"
then
{traitement necessaire}
fi
done
Dernière modification par Levi59 (Le 30/12/2010, à 13:37)
Hors ligne
#47 Le 30/12/2010, à 17:18
- Tutux80
Re : Script Schell exercice je ne comprend rien
cd $1
for i in ./*.jpg
do
if test (( $(stat -c %X $i) > $(date -d $2 '+%s')))
then
convert $i.jpg $i.png
convert $i -thumbnail '100x100'
fi
done
Voilà j'ai galéré un peu, il y a une erreur de parenthese, mais je ne sais pas ou elle est, 4 ouvertes, 4 fermées.
./TD8: line 44: Erreur de syntaxe près du symbole inattendu « ( »
./TD8: line 44: ` if test (( $(stat -c %X $i) > $(date -d $2 '+%s')))'
Voilà l'erreur
Hors ligne
#48 Le 30/12/2010, à 17:57
- Levi59
Re : Script Schell exercice je ne comprend rien
Je crois que l'erreur viens de l'espace qui manque entre la 2nd et la 3eme en partant de la fin de la ligne de test.
Pour le test, je conseillerais:
if test "$(stat -c %X $i)" -gt "$(date -d $2 '+%s')"
OU
if [ "$(stat -c %X $i)" -gt "$(date -d $2 '+%s')" ] (c'est la même chose)
Pour convert, il y a 2 erreurs. Pas dans la commande pour la première, même si je ne vois pas l'intérêt de la couper en deux (tu as un exemple dans l'énoncé), mais dans son utilisation:
tu dois faire :
jpg => png de maximum 100x100
alors que là tu essaye de faire :
jpg => png
jpg => jpg 100x100
Et deuxièmement, si on converti les variable en leur valeur lors de l'exécution, on obtient :
convert monfichier.jpg.jpg monfichier.jpg.png (Là il ne fera rien car il ne trouvera pas monfichier.jpg.jpg)
convert monfichier.jpg -thumbnail '100x100' (Je ne suis même pas sûr que cette expression soit valide... à vérifier)
Dernière modification par Levi59 (Le 30/12/2010, à 17:59)
Hors ligne
#49 Le 31/12/2010, à 03:10
- Tutux80
Re : Script Schell exercice je ne comprend rien
Ok merci, j'ai modifier mais toujours le même message d'erreur pour les parentheses, mais bon plus besoin des parentheses ^^
voila
cd $1
for i in ./*.jpg
do
if test "$(stat -c %X $i)" -gt "$(date -d $2 '+%s')"
then
convert $i -thumbnail '100x100' $i.png -thumbnail '100x100'
fi
done
La il ne me reste que a modifier ça pour que sa créé l'image dans un autre dossier je crois, je vais essayer sa (:
Hors ligne
#50 Le 31/12/2010, à 09:48
- Levi59
Re : Script Schell exercice je ne comprend rien
Pour l'erreur de parenthèse, tu es sûr que cela vienne de cette partie du script?
Pour cette ligne, celle-ci est meilleure mais il y a toujours une erreur: le second -thumbnail est inutile
et si à nouveau on remplace par les valeurs:
convert $i -thumbnail '100x100' $i.png => convert monfichier.jpg -thumbnail '100x100' monfichier.jpg.png
Il faut pour la deuxième partie que tu supprimes l'extension pour la remplacer par png :
$ variable="monfichier.jpg" ; echo ${variable%.*}.png
monfichier.png
Hors ligne