Semaine 8
Ligne de commande,
arguments, redirection, pipes
arguments, redirection, pipes
SSIE Programmation en C, Thomas Lochmatter, 2019
1
Passer des paramètres au programme
$$ ./projet simplon/1572464897.jpg 155.3
argv[0] |
argv[1] |
argv[2] |
argv[3] |
./projet | simplon/1572464897.jpg | 155.3 | NULL |
Chaque paramètre est une chaine de caractères, mais le programme peut l'interpréter comme il veut.
2
Lire les paramètres
// HIDE #include <stdio.h> #include <stdlib.h> // SHOW int main(int argc, char * argv[]) { // Vérifier le nombre de paramètres if (argc != 3) { printf("Utilisation:\n"); printf("./projet FICHIER SEUIL\n"); return 1; } // Lire les paramètres char * fichier = argv[1]; double seuil = atof(argv[2]); ... return 0; }
argv[0] |
./projet |
argv[1] |
simplon/1572464897.jpg |
argv[2] |
155.3 |
argv[3] |
NULL |
Lecture plus sophistiquée des paramètres: getopt, ou getopt_long.
3
Traiter plusieurs images
$$ ./projet simplon/1572327241.jpg bleu jour $$ ./projet simplon/1572431641.jpg gris jour $$ ./projet simplon/1572492841.jpg gris nuit $$ ...
4
Traiter plusieurs images — find
Afficher les images (*.jpg) du répertoire simplon
:
$$ find simplon -name '*.jpg'
Lancer ./projet
pour chaque image:
$$ find simplon -name '*.jpg' -exec ./projet {} \;
Correspond à
$$ ./projet simplon/1572327241.jpg $$ ./projet simplon/1572431641.jpg $$ ./projet simplon/1572492841.jpg $$ ...
A chaque itération,
{}
est replacé par le nom du fichier.5
Traiter plusieurs images — Python
import os, subprocess for image in os.listdir('simplon'): print(image) subprocess.call(['./projet', 'simplon/' + image]);
import os for image in os.listdir('simplon'): print(image) fSource = 'simplon/' + image fResultat = 'resultat/' + image + '.txt' exitCode = os.system('./projet ' + fSource + ' > ' + fResultat); if exitCode != 0: break
6
Traiter plusieurs images — make
IMAGES = $(wildcard simplon/*.jpg) RESULTATS = $(patsubst simplon/%.jpg, resultats/%.txt, $(IMAGES)) resultats/%.txt: simplon/%.jpg ./projet $< > $@ all: $(RESULTATS)
# Traiter une image $$ make resultats/1572492841.txt # Traiter toutes les images $$ make all
Dans un Makefile à part, ou comme règles supplémentaires dans le Makefile du projet.
7
8
Traiter plusieurs images — make
Syntaxe horrible! Mais:
Description d'une chaine de traitement.
Détecte les changements.
Détecte les fichiers ajoutés ou modifiés. Peut être interrompu et relancé.
Exécution parallèle possible.
$$ make -j 4 all
9
Traiter plusieurs images — C
// HIDE #include <stdio.h> #include <stdlib.h> #include <dirent.h> // SHOW DIR * repertoire = opendir("simplon"); if (repertoire == NULL) ... while (1) { struct dirent * fichier = readdir(repertoire); if (fichier == NULL) break; if (fichier->d_type != DT_REG) continue; char cheminComplet[1000]; sprintf(cheminComplet, "simplon/%s", fichier->d_name); traiterImage(cheminComplet); } closedir(repertoire);
10
Traiter plusieurs images — *.jpg
// HIDE #include <stdio.h> #include <stdlib.h> // SHOW void traiterImage(char * fichier) { ... } int main(int argc, char * argv[]) { for (int i = 1; i < argc; i++) { traiterImage(argv[i]); } return 0; }
$$ ./projet simplon/*.jpg
Correspond à
$$ ./projet simplon/1572327241.jpg simplon/1572431641.jpg ...
Glob sur Wikipedia
11
Rediriger la sortie
$$ ./projet simplon/*.jpg simplon/1570930441.jpg gris nuit simplon/1571092441.jpg gris nuit simplon/1570840441.jpg gris nuit simplon/1570948441.jpg bleu jour simplon/1571128441.jpg gris jour ... # Rediriger la sortie (STDOUT) dans un fichier $$ ./projet simplon/*.jpg > resultats.txt
Redirection sur Wikipedia —
Bash redirections
12
13
resultats.txt
simplon/1570930441.jpg gris nuit simplon/1571092441.jpg gris nuit simplon/1570840441.jpg gris nuit simplon/1570948441.jpg bleu jour simplon/1571128441.jpg gris jour simplon/1571164441.jpg gris nuit simplon/1571182441.jpg gris nuit simplon/1571056441.jpg bleu jour simplon/1570912441.jpg gris nuit simplon/1571038441.jpg gris jour simplon/1570876441.jpg bleu jour simplon/1570822441.jpg gris nuit ...
14
Fichiers texte: afficher
# Afficher le fichier entier $$ cat resultats.txt # Compter le nombre de lignes, mots, et caractères $$ wc resultats.txt # Afficher les 20 premières lignes $$ head -n 20 resultats.txt # Afficher les 20 dernières lignes $$ tail -n 20 resultats.txt # "Suivre" un fichier qui est un train d'être écrit $$ tail -f resultats.txt
15
Fichiers texte: filtrer
# Afficher les lignes qui contiennent "bleu" $$ grep bleu resultats.txt # Compter ces lignes $$ grep bleu resultats.txt | wc # Afficher les lignes qui ne contiennent pas "bleu" $$ grep -v bleu resultats.txt # Filtrer avec une expression régulière $$ grep -P '(bleu|gris)\s+[^n]' resultats.txt
Regular expression sur Wikipedia. regex101.com pour tester des expressions.
16
Fichiers texte: trier et différences
# Trier (numérique: -n, unique: -u) $$ sort resultats.txt # Histogramme des valeurs $$ cut -f 2,3 resultats.txt | sort | uniq -c # Afficher les différences entre deux fichiers $$ diff resultats-maintenant.txt resultats-avant.txt
17
18
Ligne de commande
↑
↓
Commande précédente / suivante dans l'historique des commandes
TAB
Auto-complétion des commandes, fichiers, répertoires, et parfois des options des commandes
Middle click
Insérer le texte sélectionné
19