diff options
Diffstat (limited to 'fichiers/03-grep-bash.tex')
-rw-r--r-- | fichiers/03-grep-bash.tex | 230 |
1 files changed, 173 insertions, 57 deletions
diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex index 3b685e3..65f01cf 100644 --- a/fichiers/03-grep-bash.tex +++ b/fichiers/03-grep-bash.tex | |||
@@ -21,6 +21,9 @@ | |||
21 | breaksymbolright=\small\carriagereturn} | 21 | breaksymbolright=\small\carriagereturn} |
22 | \setmintedinline{bgcolor=Lavender} | 22 | \setmintedinline{bgcolor=Lavender} |
23 | \usepackage{soul} | 23 | \usepackage{soul} |
24 | \makeindex[name=cmds, intoc, title={Liste des commandes et | ||
25 | instructions}] | ||
26 | |||
24 | \begin{document} | 27 | \begin{document} |
25 | \maketitle | 28 | \maketitle |
26 | \renewcommand{\contentsname}{Sommaire} | 29 | \renewcommand{\contentsname}{Sommaire} |
@@ -29,10 +32,10 @@ | |||
29 | \listoftables | 32 | \listoftables |
30 | 33 | ||
31 | \chapter{grep, les expressions régulières} | 34 | \chapter{grep, les expressions régulières} |
32 | \label{cha:grep-les-expressions} | 35 | \label{cha:grep-les-expressions}\index[cmds]{grep} |
33 | Les expressions régulières se rapprochent des \emph{wildcards} ou | 36 | Les expressions régulières se rapprochent des \emph{wildcards} ou |
34 | \enquote{métacaractères} qui ont été présentés dans | 37 | \enquote{métacaractères} qui ont été présentés dans |
35 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le | 38 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L714}{le |
36 | cours sur la ligne de commande}. C'est une technique commune à pour | 39 | cours sur la ligne de commande}. C'est une technique commune à pour |
37 | ainsi dire tous les langages de programmation qui permet de construire | 40 | ainsi dire tous les langages de programmation qui permet de construire |
38 | des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de | 41 | des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de |
@@ -114,6 +117,7 @@ symboles suivants\footnote{Cette liste n'est pas exhaustive.}: | |||
114 | \end{xltabular} | 117 | \end{xltabular} |
115 | 118 | ||
116 | \paragraph{grep, egrep} | 119 | \paragraph{grep, egrep} |
120 | \index[cmds]{grep|textbf}\index[cmds]{egrep|see{grep}} | ||
117 | À la place de \verb|grep|, on peut saisir à la ligne de commande | 121 | À la place de \verb|grep|, on peut saisir à la ligne de commande |
118 | \verb|egrep| ou \verb|grep -E| pour \emph{extended regular | 122 | \verb|egrep| ou \verb|grep -E| pour \emph{extended regular |
119 | expressions}. Quelle est la différence? Retenez ici simplement que | 123 | expressions}. Quelle est la différence? Retenez ici simplement que |
@@ -144,7 +148,7 @@ d'options. Parmi ces options, retenons celles-ci: | |||
144 | \end{description} | 148 | \end{description} |
145 | 149 | ||
146 | \paragraph{Exemples} | 150 | \paragraph{Exemples} |
147 | Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la | 151 | Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L737}{la |
148 | technique de la redirection}. | 152 | technique de la redirection}. |
149 | \begin{minted}{text} | 153 | \begin{minted}{text} |
150 | [robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea' | 154 | [robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea' |
@@ -352,7 +356,7 @@ art dans le cadre de la programmation en | |||
352 | \label{sec:execution} | 356 | \label{sec:execution} |
353 | Il faut ici approfondir la notion de \emph{permissions} sur les | 357 | Il faut ici approfondir la notion de \emph{permissions} sur les |
354 | fichiers qui a été présentée dans le cours sur la | 358 | fichiers qui a été présentée dans le cours sur la |
355 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L451}{ligne | 359 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L454}{ligne |
356 | de commande}. Nous avons en effet étudié trois types de permissions | 360 | de commande}. Nous avons en effet étudié trois types de permissions |
357 | sur les fichiers: en lecture, en écriture et en exécution. Revenons | 361 | sur les fichiers: en lecture, en écriture et en exécution. Revenons |
358 | sur les permissions données par défaut au script \verb|backup.sh|: | 362 | sur les permissions données par défaut au script \verb|backup.sh|: |
@@ -368,6 +372,7 @@ Soit: | |||
368 | \end{itemize} | 372 | \end{itemize} |
369 | 373 | ||
370 | \paragraph{chmod} | 374 | \paragraph{chmod} |
375 | \index[cmds]{chmod|textbf} | ||
371 | La commande qui permet de changer les droits s'appelle | 376 | La commande qui permet de changer les droits s'appelle |
372 | \verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que | 377 | \verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que |
373 | les permissions sont traduites par des valeurs numériques, à savoir: | 378 | les permissions sont traduites par des valeurs numériques, à savoir: |
@@ -402,11 +407,11 @@ où \verb|xyz| sont les trois chiffres qui représentent les permissions. | |||
402 | \begin{enumerate} | 407 | \begin{enumerate} |
403 | \item La commande \verb|chmod| a été entrée à la ligne 1. | 408 | \item La commande \verb|chmod| a été entrée à la ligne 1. |
404 | \item À la ligne 2, nous avons lancé la commande | 409 | \item À la ligne 2, nous avons lancé la commande |
405 | \mintinline{text}|ls -l --color| sur le fichier \verb|backup.sh|: | 410 | \index[cmds]{ls}\mintinline{text}|ls -l --color| sur le fichier |
406 | les droits listés à la ligne 3 montrent bien que la valeur | 411 | \verb|backup.sh|: les droits listés à la ligne 3 montrent bien que |
407 | \verb|x| a été ajoutée aux trois endroits possibles. On voit enfin | 412 | la valeur \verb|x| a été ajoutée aux trois endroits possibles. On |
408 | que l'option \verb|--color| affiche en vert les fichiers qui sont | 413 | voit enfin que l'option \verb|--color| affiche en vert les |
409 | exécutables. | 414 | fichiers qui sont exécutables. |
410 | \end{enumerate} | 415 | \end{enumerate} |
411 | \end{quoting} | 416 | \end{quoting} |
412 | 417 | ||
@@ -448,8 +453,9 @@ _preamble_bbl.tex _preamble-ed.tex _preamble.tex README.tex | |||
448 | \begin{quoting} | 453 | \begin{quoting} |
449 | \textbf{Commentaire:} | 454 | \textbf{Commentaire:} |
450 | \begin{itemize} | 455 | \begin{itemize} |
451 | \item lignes 1--11: la commande \verb|ls -l --color| donne l'état du | 456 | \item lignes 1--11: la commande \index[cmds]{ls}\verb|ls -l --color| |
452 | dossier \emph{avant} l'exécution du script \verb|backup.sh|; | 457 | donne l'état du dossier \emph{avant} l'exécution du script |
458 | \verb|backup.sh|; | ||
453 | \item lignes 12--17: exécution du script et messages du terminal; | 459 | \item lignes 12--17: exécution du script et messages du terminal; |
454 | \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du | 460 | \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du |
455 | dossier \emph{après} l'exécution du script \verb|backup.sh|. On | 461 | dossier \emph{après} l'exécution du script \verb|backup.sh|. On |
@@ -481,9 +487,9 @@ caché. | |||
481 | \label{sec:les-variables} | 487 | \label{sec:les-variables} |
482 | Les variables sont des informations temporaires qui peuvent être | 488 | Les variables sont des informations temporaires qui peuvent être |
483 | stockées et rappelées à tout moment. L'exemple qui suit va donner | 489 | stockées et rappelées à tout moment. L'exemple qui suit va donner |
484 | l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle | 490 | l'occasion d'étudier une nouvelle commande, |
485 | est justement de retourner au terminal la chaîne de caractères qu'on | 491 | \index[cmds]{echo}\verb|echo|, dont le rôle est justement de retourner |
486 | lui passe en argument: | 492 | au terminal la chaîne de caractères qu'on lui passe en argument: |
487 | \begin{minted}[linenos]{text} | 493 | \begin{minted}[linenos]{text} |
488 | [robert@kiddo courses]$ mysystem="Linux" | 494 | [robert@kiddo courses]$ mysystem="Linux" |
489 | [robert@kiddo courses]$ echo 'Mon système est $mysystem.' | 495 | [robert@kiddo courses]$ echo 'Mon système est $mysystem.' |
@@ -503,7 +509,7 @@ Mon système est Linux. | |||
503 | \end{description} | 509 | \end{description} |
504 | \begin{mdframed}[backgroundcolor=Cyan] | 510 | \begin{mdframed}[backgroundcolor=Cyan] |
505 | Observez la différence dans l'usage des guillemets! | 511 | Observez la différence dans l'usage des guillemets! |
506 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L554}{Comme | 512 | \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L558}{Comme |
507 | on le sait}, les guillemets servent à indiquer au \emph{shell} | 513 | on le sait}, les guillemets servent à indiquer au \emph{shell} |
508 | que les espaces ne sont pas des caractères actifs. Il y a | 514 | que les espaces ne sont pas des caractères actifs. Il y a |
509 | cependant une grande différence entre les guillemets simples et | 515 | cependant une grande différence entre les guillemets simples et |
@@ -538,6 +544,7 @@ echo "et l'archive $backupdir.zip a été créée." | |||
538 | \end{minted} | 544 | \end{minted} |
539 | 545 | ||
540 | \paragraph{read} | 546 | \paragraph{read} |
547 | \index[cmds]{read|textbf} | ||
541 | Cette nouvelle commande est expliquée dans le commentaire qui suit: | 548 | Cette nouvelle commande est expliquée dans le commentaire qui suit: |
542 | \begin{quoting} | 549 | \begin{quoting} |
543 | \textbf{Commentaire:} | 550 | \textbf{Commentaire:} |
@@ -598,9 +605,10 @@ précédées du signe $=$. Exemple: | |||
598 | \begin{quoting} | 605 | \begin{quoting} |
599 | \textbf{Commentaire:} | 606 | \textbf{Commentaire:} |
600 | \begin{enumerate} | 607 | \begin{enumerate} |
601 | \item À la ligne~1, la commande \verb|ls| liste les fichiers, puis | 608 | \item À la ligne~1, la commande \index[cmds]{ls}\verb|ls| liste les |
602 | son résultat est interprété par \verb|wc -l| qui compte le nombre | 609 | fichiers, puis son résultat est interprété par |
603 | de fichiers retournés. | 610 | \index[cmds]{wc}\verb|wc -l| qui compte le nombre de fichiers |
611 | retournés. | ||
604 | \item La variable \verb|$nbre| contient donc ce dernier résultat. | 612 | \item La variable \verb|$nbre| contient donc ce dernier résultat. |
605 | \end{enumerate} | 613 | \end{enumerate} |
606 | \end{quoting} | 614 | \end{quoting} |
@@ -662,24 +670,24 @@ fi | |||
662 | \begin{enumerate} | 670 | \begin{enumerate} |
663 | \item Observez la structure de la condition: | 671 | \item Observez la structure de la condition: |
664 | \begin{itemize} | 672 | \begin{itemize} |
665 | \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si | 673 | \item ligne 1: \index[cmds]{if|textbf}\mintinline{bash}|if| |
666 | <condition>} où la condition est posée entre crochets. Dans | 674 | $\rightarrow$ \emph{si <condition>} où la condition est posée |
667 | l'expression entre les crochets, % | 675 | entre crochets. Dans l'expression entre les crochets, % |
668 | \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| | 676 | \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| |
669 | existe \emph{et} est un répertoire; | 677 | existe \emph{et} est un répertoire; |
670 | \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, | 678 | \item ligne 2: \index[cmds]{then|textbf}\mintinline{bash}|then| |
671 | passez à la ligne suivante}; | 679 | $\rightarrow$ \emph{alors, passez à la ligne suivante}; |
672 | \item ligne 6: \mintinline{bash}|else| $\rightarrow$ | 680 | \item ligne 6: \index[cmds]{else|textbf}\mintinline{bash}|else| |
673 | \emph{autrement, passez à la ligne suivante}; | 681 | $\rightarrow$ \emph{autrement, passez à la ligne suivante}; |
674 | \item ligne 8: \mintinline{bash}|fi| $\rightarrow$ \emph{fin de la | 682 | \item ligne 8: \index[cmds]{fi|textbf}\mintinline{bash}|fi| |
675 | condition} (en fait les deux lettres de la conjonction \verb|if| | 683 | $\rightarrow$ \emph{fin de la condition} (en fait les deux |
676 | écrite à l'envers). | 684 | lettres de la conjonction \verb|if| écrite à l'envers). |
677 | \end{itemize} | 685 | \end{itemize} |
678 | \item À la ligne 5, la commande \verb|exit 1| ordonne au programme | 686 | \item À la ligne 5, la commande \index[cmds]{exit}\verb|exit 1| |
679 | de se terminer immédiatement et de renvoyer la valeur \verb|1| | 687 | ordonne au programme de se terminer immédiatement et de renvoyer |
680 | comme numéro d'état (\emph{status number}). Par convention, | 688 | la valeur \verb|1| comme numéro d'état (\emph{status number}). Par |
681 | \verb|0| est pour \emph{true} (le programme a bien été exécuté) et | 689 | convention, \verb|0| est pour \emph{true} (le programme a bien été |
682 | \verb|1| est pour \emph{false} (il y a eu une erreur). | 690 | exécuté) et \verb|1| est pour \emph{false} (il y a eu une erreur). |
683 | \end{enumerate} | 691 | \end{enumerate} |
684 | \end{quoting} | 692 | \end{quoting} |
685 | 693 | ||
@@ -716,10 +724,11 @@ echo "et l'archive $backupdir.zip a été créée." | |||
716 | Supposons que le répertoire de sauvegarde ait été supprimé mais que | 724 | Supposons que le répertoire de sauvegarde ait été supprimé mais que |
717 | l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le | 725 | l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le |
718 | script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons | 726 | script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons |
719 | utiliser dans le script l'instruction \verb|elif| qui permet de | 727 | utiliser dans le script l'instruction |
720 | construire des conditions en série. Littéralement, \verb|elif| est | 728 | \index[cmds]{elif|textbf}\verb|elif| qui permet de construire des |
721 | pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce | 729 | conditions en série. Littéralement, \verb|elif| est pour \emph{else |
722 | qu'il faut ajouter: | 730 | if}, \enquote{ou autrement, si\ldots}. Voici donc ce qu'il faut |
731 | ajouter: | ||
723 | \begin{minted}{bash} | 732 | \begin{minted}{bash} |
724 | elif [ -e "$backupdir".zip ] | 733 | elif [ -e "$backupdir".zip ] |
725 | then | 734 | then |
@@ -797,13 +806,15 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}. | |||
797 | \end{xltabular} | 806 | \end{xltabular} |
798 | 807 | ||
799 | \paragraph{test} | 808 | \paragraph{test} |
800 | À l'intérieur du script \verb|bash|, les crochets renvoient en fait à | 809 | \index[cmds]{test|textbf} À l'intérieur du script \verb|bash|, les |
801 | une commande par ailleurs disponible: \verb|test|. La commande | 810 | crochets renvoient en fait à une commande par ailleurs disponible: |
802 | \verb|test| renvoie en fait la sortie \verb|0| si le résultat est | 811 | \verb|test|. La commande \verb|test| renvoie en fait la sortie |
803 | \emph{vrai} et \verb|1| si le résultat est \emph{faux}. Le terminal ne | 812 | \verb|0| si le résultat est \emph{vrai} et \verb|1| si le résultat est |
804 | retourne pas le resultat, mais celui-ci est associé à une variable | 813 | \emph{faux}. Le terminal ne retourne pas le resultat, mais celui-ci |
814 | est associé à une variable | ||
805 | \verb|$?| que l'on peut afficher par la commande: | 815 | \verb|$?| que l'on peut afficher par la commande: |
806 | \mintinline{bash}|echo $?|. En voici quelques exemples: | 816 | \index[cmds]{echo}\mintinline{bash}|echo $?|. En voici quelques |
817 | exemples: | ||
807 | \begin{minted}[linenos]{text} | 818 | \begin{minted}[linenos]{text} |
808 | [robert@kiddo courses]$ ls | 819 | [robert@kiddo courses]$ ls |
809 | bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex | 820 | bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex |
@@ -837,8 +848,9 @@ L'indentation est une technique qui consiste à donner aux lignes de | |||
837 | code différentes profondeurs de marge à gauche de façon à distinguer | 848 | code différentes profondeurs de marge à gauche de façon à distinguer |
838 | clairement des blocs logiques. Les lignes 7--20 du | 849 | clairement des blocs logiques. Les lignes 7--20 du |
839 | \vref{lst:if-then-else} en donnent un exemple. L'indentation permet de | 850 | \vref{lst:if-then-else} en donnent un exemple. L'indentation permet de |
840 | faire apparaître clairement ce qui dépend de l'instruction \verb|if| | 851 | faire apparaître clairement ce qui dépend de l'instruction |
841 | (l.~7), puis \verb|elif| (l.~12) et enfin \verb|else| (l.~18). | 852 | \index[cmds]{if}\verb|if| (l.~7), puis \index[cmds]{elif}\verb|elif| |
853 | (l.~12) et enfin \index[cmds]{else}\verb|else| (l.~18). | ||
842 | 854 | ||
843 | Cette technique est commune à tous les langages informatiques et tous | 855 | Cette technique est commune à tous les langages informatiques et tous |
844 | les programmeurs l'utilisent. En Python, que nous étudierons plus | 856 | les programmeurs l'utilisent. En Python, que nous étudierons plus |
@@ -892,18 +904,18 @@ fi | |||
892 | \end{minted} | 904 | \end{minted} |
893 | 905 | ||
894 | \subsection{case} | 906 | \subsection{case} |
895 | \label{sec:case} | 907 | \label{sec:case}\index[cmds]{case|textbf} |
896 | \verb|case| est une instruction qui permet d'exécuter différentes | 908 | \verb|case| est une instruction qui permet d'exécuter différentes |
897 | actions en fonction de la valeur d'une variable. Elle est intéressante | 909 | actions en fonction de la valeur d'une variable. Elle est intéressante |
898 | à étudier ici car elle fait appel à la fois à la notion de variable et | 910 | à étudier ici car elle fait appel à la fois à la notion de variable et |
899 | aux expressions régulières. La syntaxe est la suivante: | 911 | aux expressions régulières. La syntaxe est la suivante: |
900 | \begin{minted}[linenos,escapeinside=||]{text} | 912 | \begin{minted}[linenos]{bash} |
901 | case |\emph{variable}| in | 913 | case $var in |
902 | |\emph{regexpr1}|) | 914 | expr1) |
903 | |\emph{commandes ...}| | 915 | <commandes ...> |
904 | ;; | 916 | ;; |
905 | |\emph{regexpr2}|) | 917 | expr2) |
906 | |\emph{commandes ...}| | 918 | <commandes ...> |
907 | ;; | 919 | ;; |
908 | esac | 920 | esac |
909 | \end{minted} | 921 | \end{minted} |
@@ -920,7 +932,9 @@ esac | |||
920 | \end{enumerate} | 932 | \end{enumerate} |
921 | \end{quoting} | 933 | \end{quoting} |
922 | 934 | ||
923 | Voici un exemple facile à comprendre: | 935 | Le \vref{lst:case} montre un exemple facile à comprendre de cette |
936 | technique. | ||
937 | \begin{listing}[H] | ||
924 | \begin{minted}[linenos]{bash} | 938 | \begin{minted}[linenos]{bash} |
925 | #!/bin/bash | 939 | #!/bin/bash |
926 | 940 | ||
@@ -939,12 +953,15 @@ case $animal in | |||
939 | ;; | 953 | ;; |
940 | esac | 954 | esac |
941 | \end{minted} | 955 | \end{minted} |
956 | \caption{bash: instruction \texttt{case}} | ||
957 | \label{lst:case} | ||
958 | \end{listing} | ||
942 | \begin{quoting} | 959 | \begin{quoting} |
943 | \textbf{Commentaire:} | 960 | \textbf{Commentaire:} |
944 | \begin{enumerate} | 961 | \begin{enumerate} |
945 | \item À la ligne 4, l'utilisateur est invité à entrer une | 962 | \item À la ligne 4, l'utilisateur est invité à entrer une |
946 | réponse. L'instruction \verb|read| associe la réponse à la | 963 | réponse. L'instruction \index[cmds]{read}\verb|read| associe la |
947 | variable \verb|animal|. | 964 | réponse à la variable \verb|animal|. |
948 | \item À la ligne 6, l'instruction \verb|case| reprend la variable | 965 | \item À la ligne 6, l'instruction \verb|case| reprend la variable |
949 | qui est donc préfixée par le signe \verb|$|. | 966 | qui est donc préfixée par le signe \verb|$|. |
950 | \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le | 967 | \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le |
@@ -960,10 +977,109 @@ esac | |||
960 | \begin{quoting} | 977 | \begin{quoting} |
961 | \textbf{Remarque:} à la place de l'instruction \verb|case|, on | 978 | \textbf{Remarque:} à la place de l'instruction \verb|case|, on |
962 | recommande aujourd'hui d'utiliser une nouvelle instruction, | 979 | recommande aujourd'hui d'utiliser une nouvelle instruction, |
963 | \verb|switch|, dont la syntaxe, plus complexe, n'est pas étudiée | 980 | \index[cmds]{switch}\verb|switch|, dont la syntaxe, plus complexe, |
964 | ici. | 981 | n'est pas étudiée ici. |
982 | \end{quoting} | ||
983 | |||
984 | \section{Boucles} | ||
985 | \label{sec:boucles} | ||
986 | Les boucles (en anglais: \emph{loops}) servent à indiquer qu'une série | ||
987 | d'instructions doit reprendre et continuer à s'exécuter aussi | ||
988 | longtemps qu'une condition donnée n'est pas remplie. | ||
989 | |||
990 | Prenons un exemple simple. Nous avons dans un répertoire plusieurs | ||
991 | centaines d'images et que nous souhaitons convertir au format | ||
992 | \verb|.png| toutes les images qui sont enregistrées au format | ||
993 | \verb|.tiff|. | ||
994 | |||
995 | Pour convertir une seule image, nous pouvons utiliser l'outil en ligne | ||
996 | de commande \verb|convert| fourni par le programme | ||
997 | \emph{imagemagick}\footnote{\url{http://www.imagemagick.org}}. Pour | ||
998 | convertir une seule image, la syntaxe est la suivante: | ||
999 | \begin{minted}{bash} | ||
1000 | convert image.tiff image.png | ||
1001 | \end{minted} | ||
1002 | |||
1003 | Mais comment faire pour en convertir un grand nombre pris dans un | ||
1004 | répertoire qui en compte des centaines enregistrées dans des formats | ||
1005 | différents? | ||
1006 | |||
1007 | \paragraph{basename} | ||
1008 | \index[cmds]{basename|textbf}Avant de continuer, il faut dire un mot | ||
1009 | de la commande \verb|basename| que nous allons utiliser ici. Cette | ||
1010 | commande permet de dépouiller un nom de fichier de son chemin d'accès | ||
1011 | et de son extension. La syntaxe est la suivante: | ||
1012 | \begin{minted}[escapeinside=||]{text} | ||
1013 | basename -s .|\emph{ext}| |\emph{file}| | ||
1014 | \end{minted} | ||
1015 | où \emph{ext} est le nom de l'extension et \emph{file} le nom du | ||
1016 | fichier. Voici un exemple: | ||
1017 | \begin{minted}{text} | ||
1018 | [robert@kiddo fichiers]$ ls -l images/ | ||
1019 | total 252 | ||
1020 | -rw-r--r-- 1 robert robert 96404 2 juil. 18:32 02-ascii.png | ||
1021 | -rw-r--r-- 1 robert robert 33951 20 juin 19:59 02-donnees1.png | ||
1022 | -rw-r--r-- 1 robert robert 11503 20 juin 20:01 02-donnees2.png | ||
1023 | -rw-r--r-- 1 robert robert 17450 3 juil. 17:43 02-exercice_formats.png | ||
1024 | -rw-r--r-- 1 robert robert 87510 14 sept. 15:06 02-unicode.png | ||
1025 | [robert@kiddo fichiers]$ basename -s .png images/* | ||
1026 | 02-ascii | ||
1027 | 02-donnees1 | ||
1028 | 02-donnees2 | ||
1029 | 02-exercice_formats | ||
1030 | 02-unicode | ||
1031 | \end{minted} | ||
1032 | |||
1033 | \paragraph{for-do-done} | ||
1034 | \index[cmds]{for|textbf}\index[cmds]{do|textbf}\index[cmds]{done|textbf} | ||
1035 | La boucle que nous allons utiliser fait appel à trois instructions: | ||
1036 | \begin{enumerate} | ||
1037 | \item \verb|for| prend comme argument un nom qui sera ensuite traité | ||
1038 | comme une variable. Le nom de la variable est suivi de l'instruction | ||
1039 | \verb|in| et d'un nom de fichier qui contient des données séparées | ||
1040 | par des espaces ou bien d'une expression dans laquelle on a placé | ||
1041 | des \emph{wildcards}. | ||
1042 | \item \verb|do| est suivi des commandes qu'il faut exécuter sur chaque | ||
1043 | élément retourné par l'instruction \verb|for| \ldots{} \verb|in|. | ||
1044 | \item \verb|done| marque la fin de la boucle. | ||
1045 | \end{enumerate} | ||
1046 | |||
1047 | Voici maintenant le script qui assure la conversion du format | ||
1048 | \verb|.tiff| vers le format \verb|.png|: | ||
1049 | \begin{listing}[H] | ||
1050 | \begin{minted}[linenos]{bash} | ||
1051 | #!/bin/bash | ||
1052 | for file in $(basename -s .tiff $(ls *.tiff)) | ||
1053 | do convert "$file".tiff "$file".png | ||
1054 | done | ||
1055 | \end{minted} | ||
1056 | \caption{bash: \texttt{for ... do ... done}} | ||
1057 | \end{listing} | ||
1058 | |||
1059 | \begin{quoting} | ||
1060 | \textbf{Commentaire:} | ||
1061 | \begin{enumerate} | ||
1062 | \item Comprendre ainsi le début de la ligne~2 % | ||
1063 | (\mintinline{bash}|for file in|): \enquote{pour tout \texttt{file} | ||
1064 | dans\ldots} où \verb|file| définit une variable dont la valeur | ||
1065 | pourra ensuite être rappelée par \verb|$file|. Le reste de la | ||
1066 | ligne est une \emph{double capture} (v.~\emph{supra}, | ||
1067 | \vref{sec:capt-et-subst}): | ||
1068 | \begin{enumerate} | ||
1069 | \item \verb|$(ls *.tiff)| liste et retourne tous les fichiers dont | ||
1070 | l'extension est \verb|.tiff| | ||
1071 | \item \verb|$(basename -s .tiff $(ls *.tiff))| demande à | ||
1072 | \verb|basename| de dépouiller tous ces fichiers de leur | ||
1073 | extension \verb|.tiff| et retourne la liste des noms seuls. | ||
1074 | \end{enumerate} | ||
1075 | \item La variable \verb|file| est donc une liste constituée des noms | ||
1076 | de tous les fichiers \verb|.tiff| sans leur extension. La ligne~3 | ||
1077 | les convertit tous les uns après les autres vers le format | ||
1078 | \verb|.png|. | ||
1079 | \end{enumerate} | ||
965 | \end{quoting} | 1080 | \end{quoting} |
966 | 1081 | ||
967 | \hfill\verb|../..| à suivre | 1082 | \hfill\verb|../..| à suivre |
968 | 1083 | ||
1084 | \printindex[cmds] | ||
969 | \end{document} | 1085 | \end{document} |