#1 Le 01/10/2012, à 11:40
- alfirdaous
Une boucle pour ajout execution d'une commande
Bonjour,
Comment faire une boucle pour executer une ligne de commande, executer la commande juste apres termine la precedente:
sudo ffmpeg -i INPUT001.mp4 -strict experimental -vf "drawtext=fontfile='/usr/share/fonts/truetype/msttcorefonts/Times_New_Roman_Bold.ttf':text='Test Text':x=10:y=10:fontsize=20:fontcolor=white" -vcodec libx264 -crf 30 OUTPUT001.mp4
Apres avoir termine avec le fichier INPUT001.mp4 qui produira OUTPUT001.mp4, le script passera vers INPUT002.mp4 qui prodouira OUTPUT002.mp4, ainsi de suite, jusqu'a INPUT030.mp4.
Merci
Hors ligne
#2 Le 01/10/2012, à 11:56
- Postmortem
Re : Une boucle pour ajout execution d'une commande
Salut,
En bash, tu peux faire ainsi :
for num in {001..030}
do
sudo ffmpeg -i "INPUT${num}.mp4" -strict experimental -vf "drawtext=fontfile='/usr/share/fonts/truetype/msttcorefonts/Times_New_Roman_Bold.ttf':text='Test Text':x=10:y=10:fontsize=20:fontcolor=white" -vcodec libx264 -crf 30 "OUTPUT${num}.mp4"
done
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 01/10/2012, à 12:14
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
Merci Postmortem, je vais le tester, et pour une ligne de commande?
Hors ligne
#4 Le 01/10/2012, à 13:21
- credenhill
Re : Une boucle pour ajout execution d'une commande
hello
printf "%s\n" {001..030} | xargs -i sudo ffmpeg -i INPUT{}.mp4 -strict experimental -vf "drawtext=fontfile='/usr/share/fonts/truetype/msttcorefonts/Times_New_Roman_Bold.ttf':text='Test Text':x=10:y=10:fontsize=20:fontcolor=white" -vcodec libx264 -crf 30 OUTPUT{}.mp4
Hors ligne
#5 Le 01/10/2012, à 14:25
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
Merci credenhill: j'ai pas compris cette partie du code:
printf "%s\n" {001..030} | xargs
Hors ligne
#6 Le 01/10/2012, à 14:42
- credenhill
Re : Une boucle pour ajout execution d'une commande
printf va envoyer 001, 002 etc et xargs va exécuter la commande sudo ffmpeg ... pour chaque nombre, donc
sudo ffmpeg -i INPUT001.mp4 ... OUTPUT001.mp4
sudo ffmpeg -i INPUT002.mp4 ... OUTPUT002.mp4
sudo ffmpeg -i INPUT003.mp4 ... OUTPUT003.mp4
...
Hors ligne
#7 Le 01/10/2012, à 16:07
- nesthib
Re : Une boucle pour ajout execution d'une commande
Après, faire une seule ligne sans raison, ça n'a pas trop de sens… surtout si tu ne comprends pas pourquoi.
En plus tu peux mettre le bloc for sur une seule ligne :
for i in … ; do commande ; done
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#8 Le 01/10/2012, à 20:50
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
En utilisant sudo, la console va nous demander le mot de passe a chaque nouvelle execution, il n'est pas recommande d'utiliser sudo, mais y a t il un moyen d'entrer le mot de passe en notre absence?
Hors ligne
#9 Le 01/10/2012, à 23:34
- nesthib
Re : Une boucle pour ajout execution d'une commande
Non, sudo ne devrait pas te demander le mot de passe à chaque fois. Il y a un laps de temps pendant lequel sudo ne redemande pas le mot de passe (10 minutes par défaut).
Si tu veux tu peux encapsuler le tout en root en lançant le script lui même avec sudo ou en faisant :
sudo bash <<EOF
commande 1
for … ; do commande 2 ; done
commande 3
EOF
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#10 Le 02/10/2012, à 01:20
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
oui c'est vrai, mais le traitement demande entre 30 et 40 minutes
Hors ligne
#11 Le 02/10/2012, à 01:44
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
@credenhill:
Il reste le "%s\n" et -i
printf "%s\n" {001..030} | xargs -i
@nesthib: ou puis je trouver la doc de ces commandes
Merci
Hors ligne
#12 Le 02/10/2012, à 03:31
- nesthib
Re : Une boucle pour ajout execution d'une commande
de quelle commandes parles-tu ? Du <<EOF ? Ça n'est pas une commande mais une syntaxe shell (et d'autres langages) courante appelée « here document ». En gros le << définit que le séparateur qui suit (ici « EOF », mais ça pourrait être n'importe quoi dès lors qu'il n'apparaît pas dans le texte) indiquera la fin du bloc de texte. Pour la doc, tu la trouveras par exemple dans le man de bash à la section Here Documents
cat <<FIN
bonjour
voici plusieurs lignes
dans lesquelles je ne m'occupe pas
du contenu (comme des ")
FIN
En ce qui concerne les question que tu poses à credenhill, essaie de faire un petit effort de recherche… en l'occurrence pour la seconde il suffit de lire le man. Pour la première %s représente une chaîne de caractère (string) qui sera définie par l'argument qui suit (ici la suite de nombres) et \n représente un saut de ligne.
NB. simple curiosité, mais en quoi as-tu besoin des droits root pour faire une conversion vidéo ?
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#13 Le 02/10/2012, à 04:58
- pingouinux
Re : Une boucle pour ajout execution d'une commande
Bonjour,
En gros le << définit que le séparateur qui suit (ici « EOF », mais ça pourrait être n'importe quoi dès lors qu'il n'apparaît pas dans le texte) indiquera la fin du bloc de texte.
En fait, ce n'est pas tout-à-fait vrai. Le "délimiteur" ne termine le "Here Document" que s'il est seul sur une ligne, mais il peut apparaître dans le texte. Pour reprendre ton exemple, ceci marche aussi.
cat <<FIN
bonjour
voici plusieurs lignes
Oh, il y a le mot FIN !
dans lesquelles je ne m'occupe pas
du contenu (comme des ")
FIN
Hors ligne
#14 Le 02/10/2012, à 06:03
- nesthib
Re : Une boucle pour ajout execution d'une commande
Effectivement, désolé pour cette approximation
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#15 Le 02/10/2012, à 08:16
- credenhill
Re : Une boucle pour ajout execution d'une commande
@credenhill:
Il reste le "%s\n" et -iprintf "%s\n" {001..030} | xargs -i
%s\n : affiche un nombre par ligne
xargs -i : remplace {} à droite de xargs par ce qui vient du pipe
$ echo {1..3}
1 2 3
$
$ printf "%s\n" {1..3}
1
2
3
$ printf "%s\n" {1..3} | xargs -i echo traitement de {}
traitement de 1
traitement de 2
traitement de 3
$
Hors ligne
#16 Le 03/10/2012, à 01:25
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
donc je peux faire comme ca: Telecharger 1.avi, 2.avi, 3.avi
$ printf "%s\n" {1..3} | xargs -i sudo wget site.com/{}.avi
Si je connais pas le contenu qui est apres le slash du .com, est-il possible d'executer la commande sachant que tous les fichiers sot en .avi
Dernière modification par alfirdaous (Le 03/10/2012, à 01:38)
Hors ligne
#17 Le 03/10/2012, à 07:58
- pingouinux
Re : Une boucle pour ajout execution d'une commande
Bonjour,
@alfirdaous #16 : C'est correct, mais ceci est équivalent :
sudo wget site.com/{1..3}.avi
Hors ligne
#18 Le 03/10/2012, à 08:54
- alfirdaous
Re : Une boucle pour ajout execution d'une commande
Bonjour,
@alfirdaous #16 : C'est correct, mais ceci est équivalent :sudo wget site.com/{1..3}.avi
Oui, c'est juste pour s'assurer que j'ai bien compris la commande, j'ai besoin de cette partie:
Si je connais pas le contenu qui est apres le slash du .com, est-il possible d'executer la commande sachant que tous les fichiers sot en .avi
Hors ligne