Mini-test 9
Parsing de date, archives, tests d'existence, recherche par nom et par contenu
6 questions ciblees
Cliquez Voir la solution sur chaque slide
Question 1 / 6 $(date +...) dans un nom
backup-AAAA-MM-JJ.tgz
(ex. backup-2026-05-13.tgz) du repertoire /var/lib/ircd-hybrid/.
backup-2026-05-13_14-30.tgz) :man date. Format : %Y annee, %m mois,
%d jour, %H heure, %M minute. La
substitution de commande : $(date +%Y-%m-%d).
# a) Date du jour AAAA-MM-JJ (tri naturel) tar -czf backup-$(date +%Y-%m-%d).tgz /var/lib/ircd-hybrid/ # b) Avec heure (utile si plusieurs sauvegardes par jour) tar -czf backup-$(date +%Y-%m-%d_%H-%M).tgz /var/lib/ircd-hybrid/
Pourquoi %Y-%m-%d ? Le tri alphabetique correspond au tri
chronologique. Eviter %d-%m-%Y qui trie mal (les 01-* viennent
avant les annees).
Variantes utiles :
date +%Y%m%dT%H%M%S # format ISO 8601 propre date +%s # timestamp Unix (secondes depuis 1970) date '+%d %B %Y' # "13 May 2026" lisible humain
Question 2 / 6 tar : c / t / x
archives.tgz.
archives.tgz a partir de /etc/ircd-hybrid/ :archives.tgz sans extraire :archives.tgz dans le repertoire courant :man tar. Lettres-cles : -c create,
-t tlist (lister), -x extract. Toujours combiner
avec -z pour gzip et -f pour le nom de fichier.
# a) Creer (compresse) tar -czf archives.tgz /etc/ircd-hybrid/ # b) Lister sans extraire tar -tzf archives.tgz # c) Extraire dans le repertoire courant tar -xzf archives.tgz
Decoupage des switches :
c create (creer) / t tlist (lister) / x extract (extraire)z = compression gzip (sortie ou entree .tgz)f FICHIER = nom du fichier d'archive (toujours le DERNIER switch avant le nom)v bonus : verbose (afficher la liste des fichiers traites)Autres formats : -j pour bzip2 (.tbz2), -J pour xz (.txz), --zstd pour zstd.
Question 3 / 6 [ -f ] et [ -d ]
/etc/ircd-hybrid/ircd.conf n'existe pas, le copier depuis le modele /etc/ircd-hybrid/ircd.conf.default :/var/log/ircd-hybrid n'existe pas, le creer (avec parents) :man test ou man bash section CONDITIONAL EXPRESSIONS.
-f = fichier ordinaire, -d = repertoire, -e = n'importe quoi.
Pour la negation : ! -f ou [ ! -f ... ].
# a) Fichier de config manquant : restaurer depuis le modele [ -f /etc/ircd-hybrid/ircd.conf ] || cp /etc/ircd-hybrid/ircd.conf.default /etc/ircd-hybrid/ircd.conf # b) Repertoire de log a creer si absent [ -d /var/log/ircd-hybrid ] || mkdir -p /var/log/ircd-hybrid
Cles a connaitre :
-f fichier ordinaire existe-d repertoire existe-e existe (fichier OU repertoire OU lien)-r lisible / -w ecrivable / -x executable-s existe ET non videVariante moderne avec [[ ]] :
if [[ ! -f /etc/ircd-hybrid/ircd.conf ]]; then
cp /etc/ircd-hybrid/ircd.conf.default /etc/ircd-hybrid/ircd.conf
fi
Question 4 / 6 find : par nom
.conf quelque part sous /etc/ :.log dans /var/log/ modifies dans les 7 derniers jours :man find. Format : find ou-chercher -critere1 -critere2 ....
-name = nom (utiliser les guillemets si jokers), -mtime = age
(en jours ; -N = moins de N jours, +N = plus de N jours).
# a) Tous les .conf dans /etc (recursif par defaut) find /etc -name "*.conf" # b) Les .log modifies dans les 7 derniers jours find /var/log -name "*.log" -mtime -7
Autres criteres utiles :
-type f seulement les fichiers, -type d seulement les repertoires-mtime -N = moins de N jours / +N = plus de N jours-size +10M = plus de 10 megas-user nadine = appartenant a un utilisateur precis-iname = insensible a la casseActions a la fin : -print (defaut), -delete, -exec cmd {} +.
Question 5 / 6 grep : par contenu
port 6667 dans tous les fichiers de /etc/ircd-hybrid/ :man grep. -r recursif (descend dans les sous-repertoires),
-l liste seulement les NOMS de fichiers correspondants,
-i insensible a la casse, -n affiche les numeros de ligne.
# a) Recherche recursive du motif grep -r "port 6667" /etc/ircd-hybrid/ # b) Seulement les noms de fichiers qui matchent grep -rl "port 6667" /etc/ircd-hybrid/ # Equivalent (l et r dans n'importe quel ordre) grep -l -r "port 6667" /etc/ircd-hybrid/
Options frequentes de grep :
-r ou -R recursif-l liste les noms de fichiers (l = "files with match")-L liste les fichiers SANS match (l'inverse)-i insensible a la casse-n numero de ligne-c compte les matches par fichier-v inverser (afficher les lignes qui NE matchent PAS)-E regex etendue (alternation foo|bar)Question 6 / 6 find + grep
Listez tous les fichiers .conf sous /etc/ qui contiennent enable_ssl=yes. Une seule commande, en chainant find et grep :
-exec de find lance une commande pour chaque fichier
trouve. Le symbole {} represente le fichier courant. Terminer
par \; (une commande par fichier) ou + (commande
groupee, plus efficace). Alternative : grep -r --include="*.conf".
# Methode classique : find -exec grep
find /etc -name "*.conf" -exec grep -l "enable_ssl=yes" {} +
# Variante avec --include de grep (plus simple a retenir)
grep -rl --include="*.conf" "enable_ssl=yes" /etc/
# Variante avec xargs (utile si on veut piper a autre chose ensuite)
find /etc -name "*.conf" | xargs grep -l "enable_ssl=yes"
Les 3 variantes valent mieux que l'autre ?
find -exec ... {} + : ramasse plusieurs fichiers
dans un seul appel a grep. Sur, marche partout.grep -r --include : plus court a taper, mais
limite aux jokers simples sur le nom.find | xargs grep : pratique pour chainer.
Probleme avec les noms qui contiennent des espaces (utiliser
find ... -print0 | xargs -0 grep).Difference {} \; vs {} + :
find . -name "*.txt" -exec grep "foo" {} \; # 1 grep PAR fichier (lent)
find . -name "*.txt" -exec grep "foo" {} + # 1 grep avec PLUSIEURS fichiers (rapide)
Bilan
-l pour les noms)R pour recommencer.