#contab -etu aura un editeur VI
30 23 * * * /home/user/script-de-ouf.sh >>/tmp/log_s.log // Tous les jours à 23h30lis le man pour comprendre.
#!/bin/sh vlc -[arguments..](si tu utilise vlc par exemple)
#!/bin/sh for fichier in /home/videos/ * do (vlc....) echo 'video converti avec success !' done
[fr.lang.free.fr]Citation
guillaumeH
Connaissez vous un bon site pour apprendre le bash ?
Ton script ne fait pas ce que tu décris. Il affiche "success" dans tous les cas (c'est à dire même si la conversion n'a pas réussie)Citation
guillaumeH
Dernière question, j'ai codé ca, pouvez vous me
dire si c'est bon ?
#!/bin/sh
for fichier in /home/videos/ *
do
(vlc....)
echo 'video converti avec success !'
done
le but de ce bout de prog étant de aller convertir
avec VLC chaque fichier présent dans
/home/videos/, et d'afficher "success" si il a
réussi.
vlc ...; statut=$? ...<autre chose> if test $statut -eq 0 then ____echo "vlc success" else ____echo "vlc raté" fi
if vlc ... then ____echo "vlc success" else ____echo "vlc raté" fi
Tu veux sans doute dire "for fichier in /home/videos/*" (pas d'espace entre "/" et "*" car cela symbolise un nom de fichier commençant par "/home/videos/" et finissant par n'importe quoi)Citation
guillaumeHfor fichier in /home/videos/ * do
ls /home/videos/* |while read fichier do ... doneTout le contenu du "ls" est stocké dans le pipe. Puis, le read vient tranquillement piocher dedans chaque ligne (donc chaque nom) et la boucle "while" tourne. Quand le pipe est vide, "read" renvoie faux donc le "while" s'arrête. Simple et efficace. Seul pb: si tu remplis une variable (style un compteur) dans le do...done, tu la perds à la fin du done (hé oui, pipe => sous-processus). Il y a des moyens plus complexes pour résoudre ce genre de pb mais on en parlera plus tard...
#!/bin/sh # boucle lisant chaque fichier ls /home/videos/* | while read fichier do # la commande a faire pour chaque fichier vlc ... # est-ce que le programme a terminé correctement statut=$? if test $statut -eq 0 then echo "ok tout va bien" else echo "probleme" fi done
Danger. La variable "$?" récupère automatiquement (donc tu peux rien y faire) l'état de la dernière commande exécutée.Citation
guillaumeH
# la commande a faire pour chaque fichier vlc ... # est-ce que le programme a terminé correctement statut=$?
# la commande a faire pour chaque fichier vlc ...; statut=$? # On met l'affectation sur la même ligne # est-ce que le programme a terminé correctement if test $statut -eq 0 ...
Non. La syntaxe "read xxx" lit l'entrée standard et la stocke dans la variable "xxx". Là, l'entrée standard est issue du pipe qui reçoit le contenu du "ls" donc ta commande "read" lit un nom de fichier. Ce nom est stocké dans une variable nommée "fichier" car c'est ce qu'il y a de plus logique...Citation
guillaumeH
petite question :
pour le "while read fichier" : on ne doit pas
définir le type "fichier" (je réfléchis comme en C
par exemple : FILE * fichier) ?
Tu peux remplacerCitation
guillaumeH
Il est surement possible de l'optimiser, mais bon
ya a peine 10 lignes alors je sais pas si ça vaut
le coup ?
Merci.
vlc ...; statut=$? if test $statut -eq 0par
if vlc ...En effet, "if" veut impérativement une commande. On emploie couramment le "if test" car la commande "test" permet de tester plein de trucs mais ce n'est pas obligatoire. La seule obligation est que ce qu'il y a après le "if" soit une commande Unix valide qui renvoie "0" quand tout s'est bien passé et une autre valeur (peu importe) quand il y a eu un pb. Tu peux même créer un script shell "toto.sh" qui respecte cette règle et écrire ensuite "if toto.sh ..."
#!/bin/sh ls /home/videos/* | while read fichier do if vlc... then echo"ok" else echo "probleme" fi done
Citation
guillaumeH
Petite question : il ne devrait pas y avoir de
problème de droits, pour lister des répertoires et
ecrire dans d'autres, le contab devrait avoir les
droits suffisant pour faire cela, ou bien il faut
que je chmod mon sh ?Merci
ls ne fait pas tout. Il faut aussi un peu programmer de ton coté... Pour ton pb, il te suffit de filtrer dans ta boucle, tout ce qui n'est pas fichier...Citation
guillaumeH
Salut,
Je reviens avec un dernier ptit problème :/
lorsque le lance mon "ls -R /home/videos/* | while
read fichier"
(car mes videos sont dans des sous repertoires) il
prend en compte le repertoire comme un fichier et
donc forcement j'ai droit a une erreur (ce n'est
pas une video..)
Malgré la lecture du man ls, je ne sais pas
comment faire lire seulement les fichiers ?
Merci
ls -R /home/videos/* |while read fichier do ....# Elimination de tout ce qui n'est pas fichier ....test ! -f "$fichier" && continue ....# Ici, on est certain que "$fichier" est bien un fichier ....<suite du code> done
# Elimination de tout fichier ne contenant pas le mot "video" dans sa description file "$fichier" |grep "video" 1>/dev/null || continue
ls -R /home/videos/* | while read fichier do file "$fichier" |grep "video" 1>/dev/null || if /usr/bin/ffmpeg -i "$fichier" (...) sortie.mpg then echo "Conversion du fichier $fichier réussi." else echo "Probleme de conversion du fichier $fichier" fi
Citation
guillaumeH
J'ai donc qqchose comme :
ls -R /home/videos/* | while read fichier do file "$fichier" |grep "video" 1>/dev/null || if /usr/bin/ffmpeg -i "$fichier" (...) sortie.mpg then echo "Conversion du fichier $fichier réussi." else echo "Probleme de conversion du fichier $fichier" fimais il doit y avoir un probleme avec la variable $fichier car il me dit qu'il ne trouve pas le fichier..
merci
Citation
Sve@r
Remplace "file $fichier" par "file /home/videos/$fichier".
Non non, pas de pb - Remplace "ls -R /home/video/* |while read fichier" parCitation
guillaumeH
Le probleme est, comme tu peux voir j'ai des repertoire recursifs a traiter (ls -R)
T'as raison, j'avais pas fait attention au "-R"
donc je ne connais pas par avance le repertoire exact de la
video a traiter. c.a.d ça peut etre
/home/videos/policier/video.avi puis
/home/videos/humour/film.avi etc..
je suis chiant
find /home/video -type f -print |while read fichierEt remet "file $fichier" comme c'était au début et là, ça (devrait) marcher.
Là j'en sais rien. faut un peu que tu te débrouilles tout seul. Mets du "echo $fichier" juste après le "do" histoire de voir le nom du fichier que tu vas traiter. Encadre les instructions qui te semblent douteuses par un "set +x" avant la première instruction et un "set -x" après la dernière. Toutes tes instructions encadrées seront affichées avant d'être exécutées. Ca doit être un truc tout con qui fait que ça marche pas. D'ailleurs, en relisant mon code un peu plus haut, je vois que j'avais écrit :Citation
guillaumeH
Mais le 1er fichier du 1er repertoire est bien encodé, mais depuis le "find..." il s'arrete apres le 1er justement, il ne continue pas dans les
autres repertoires..
# Elimination de tout fichier ne contenant pas le mot "video" dans sa description file "$fichier" |grep "video" 1>/dev/null || continueCe qui signifie
file "$fichier" |grep "video" 1>/dev/null || if /usr/bin/ffmpeg -i "$fichier" (...) sortie.mpgCe qui signifie