Exercice 02 : Gérer les Fichiers et Répertoires
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer des fichiers et des arborescences de répertoires
- ✅ Copier, déplacer et renommer des fichiers
- ✅ Supprimer des fichiers et répertoires de manière contrôlée
- ✅ Lire le contenu des fichiers avec
cat,head,tail,less - ✅ Rechercher des fichiers avec
findet du texte avecgrep
Durée estimée : 20 minutes
Difficulté : ⭐⭐☆☆☆ (Débutant+)
Prérequis :
- Avoir complété l'exercice 01 (navigation)
- Un terminal Linux fonctionnel
📖 Contexte
La gestion des fichiers est une tâche quotidienne pour un ingénieur DevOps. Que ce soit pour organiser des scripts, déployer des configurations, ou nettoyer des logs, vous devez maîtriser la création, la copie, le déplacement et la suppression de fichiers. Cet exercice vous met en situation réelle.
📋 Énoncé
Vous êtes un développeur qui démarre un nouveau projet web. Vous allez créer la structure du projet, ajouter des fichiers de configuration, organiser le code, puis rechercher des informations dans ces fichiers.
Résultat attendu :
- Un projet avec une arborescence complète
- Des fichiers de configuration remplis
- La capacité de rechercher et lire du contenu efficacement
🧭 Déroulement de l'exercice
Voici les grandes étapes à réaliser dans l'ordre. Chaque étape décrit ce que vous devez accomplir - à vous de trouver la commande. La solution complète est disponible si vous êtes bloqué.
Tâche 1 : Créer une arborescence de répertoires
Créez dans votre home le dossier mon-projet-web avec les sous-dossiers src, config, docs, tests, logs. Créez aussi src/css, src/js, src/images. Faites-le en un minimum de commandes.
Indice :
mkdira une option pour créer des répertoires imbriqués en une seule commande, même si les parents n'existent pas encore. Elle s'appelle-p(pour *parents*).
Vérification : ls -la mon-projet-web/ doit afficher les 5 sous-dossiers. ls mon-projet-web/src/ doit afficher 3 sous-dossiers.
Tâche 2 : Créer des fichiers avec du contenu
Créez un README.md avec un titre et quelques lignes, un fichier HTML dans src/, et un fichier CSS dans src/css/.
Indice : Pour un fichier court,
echo "texte" > fichiersuffit. Pour plusieurs lignes, utilisezcat > fichier << 'EOF' ... EOFou un éditeur.>>ajoute à la fin sans écraser.
Vérification : cat README.md doit afficher votre contenu. cat src/index.html doit afficher du HTML valide.
Tâche 3 : Copier des fichiers et des répertoires
Copiez README.md dans docs/. Copiez ensuite le répertoire src/ entier vers un dossier src-backup/.
Indice :
cpcopie des fichiers. Pour copier un répertoire entier avec tout son contenu, il faut une option supplémentaire.
Question à se poser : Quelle option de cp permet la copie récursive d'un répertoire ?
Vérification : docs/README.md doit exister et le dossier src-backup/ doit contenir les mêmes fichiers que src/.
Tâche 4 : Déplacer et renommer
Déplacez src-backup/ dans tests/. Renommez config/ en configuration/.
Indice : La même commande
mvsert à déplacer ET à renommer. La différence : si la destination est un nouveau nom dans le même dossier, c'est un renommage. Si c'est un autre dossier, c'est un déplacement.
Vérification : src-backup/ ne doit plus exister à la racine du projet. tests/src-backup/ doit exister. configuration/ doit exister à la place de config/.
Tâche 5 : Supprimer des fichiers et des répertoires
Supprimez le dossier tests/src-backup/ et son contenu. Supprimez ensuite le fichier docs/README.md.
Indice :
rmsupprime des fichiers. Pour supprimer un répertoire non-vide, il faut une option supplémentaire. Attention : il n'y a pas de corbeille - la suppression est définitive !
Question à se poser : Comment éviter de supprimer accidentellement des fichiers importants avec rm ?
Vérification : ls tests/ ne doit plus afficher src-backup/. ls docs/ ne doit plus afficher README.md.
Tâche 6 : Rechercher des fichiers et du texte
Trouvez tous les fichiers .html dans le projet. Cherchez ensuite le mot "charset" dans tous les fichiers du projet.
Indice :
findcherche des fichiers par nom, type ou date.grepcherche du texte dans le contenu des fichiers. Ces deux outils sont complémentaires.
Question à se poser : Quelle commande find trouve tous les fichiers .html ? Quelle option de grep cherche récursivement dans tous les sous-dossiers ?
Vérification : find doit lister src/index.html. grep doit trouver la ligne contenant "charset" dans ce fichier.
� Mini-Projet : Organiser un déploiement d'application
Vous devez préparer l'arborescence d'une application prête à être déployée, en gérant les fichiers de manière professionnelle.
Scénario : Vous préparez le dossier de déploiement d'une application web pour la livrer sur un serveur. Tout doit être bien organisé, les fichiers inutiles supprimés, et les bons fichiers au bon endroit.
Ce que vous devez réaliser :
- Créez l'arborescence suivante en une ou deux commandes :
deploy-app/
├── app/
│ ├── static/
│ ├── templates/
│ └── config/
├── scripts/
├── backups/
└── logs/- Créez dans
app/config/un fichiersettings.envcontenant 3 lignes de configuration (formatCLE=valeur) - Créez dans
app/templates/un fichierindex.htmlavec une structure HTML minimale - Créez dans
scripts/un fichierstart.shavec la ligne#!/bin/bashen première ligne - Copiez
settings.envdansbackups/en le renommantsettings.env.bak - Déplacez
app/static/pour le renommer enapp/assets/ - Cherchez tous les fichiers
.htmldans le projet (avecfind) - Cherchez le mot
bashdans tous les fichiers du projet (avecgrep -r) - Supprimez le dossier
logs/(vide pour l'instant)
Checkpoints de validation :
find deploy-app -type fliste exactement 4 fichiers (settings.env,index.html,start.sh,settings.env.bak)cat deploy-app/backups/settings.env.bakaffiche les 3 lignes de configurationls deploy-app/app/afficheassets/,config/,templates/(passtatic/)find deploy-app -name "*.html"retournedeploy-app/app/templates/index.htmlgrep -r "bash" deploy-app/trouve le fichierstart.shls deploy-app/ne liste pluslogs/
�📚 Étapes Détaillées
Étape 1 : Créer la Structure du Projet
Objectif : Créer une arborescence complète en une seule commande
Instructions :
- Créez l'arborescence du projet :
cd ~
mkdir -p mon-projet-web/{src,config,docs,tests,logs}- Vérifiez la structure créée :
ls -la mon-projet-web/Résultat attendu :
total 28
drwxr-xr-x 7 alice alice 4096 Apr 10 10:00 .
drwxr-xr-x 5 alice alice 4096 Apr 10 10:00 ..
drwxr-xr-x 2 alice alice 4096 Apr 10 10:00 config
drwxr-xr-x 2 alice alice 4096 Apr 10 10:00 docs
drwxr-xr-x 2 alice alice 4096 Apr 10 10:00 logs
drwxr-xr-x 2 alice alice 4096 Apr 10 10:00 src
drwxr-xr-x 2 alice alice 4096 Apr 10 10:00 tests- Créez des sous-dossiers dans
src/:
mkdir -p mon-projet-web/src/{css,js,images}- Entrez dans le projet :
cd mon-projet-webTroubleshooting :
- Problème :
mkdir: cannot create directory→ Vérifiez que vous avez les droits d'écriture dans le dossier courant avecls -la
Étape 2 : Créer des Fichiers
Objectif : Créer des fichiers avec du contenu
Instructions :
- Créez un fichier
README.md:
echo "# Mon Projet Web" > README.md
echo "" >> README.md
echo "Un projet de démonstration pour apprendre Linux." >> README.md
echo "" >> README.md
echo "## Installation" >> README.md
echo "Cloner ce repository et ouvrir index.html" >> README.md- Créez un fichier HTML :
cat > src/index.html << 'EOF'
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon Projet Web</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<h1>Bienvenue sur Mon Projet Web</h1>
<p>Ce projet est une démonstration.</p>
<script src="js/app.js"></script>
</body>
</html>
EOF- Créez un fichier CSS :
cat > src/css/style.css << 'EOF'
/* Style principal */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
h1 {
color: #333;
}
p {
color: #666;
line-height: 1.6;
}
EOF- Créez un fichier JavaScript :
cat > src/js/app.js << 'EOF'
// Application principale
console.log("Application chargée");
function init() {
console.log("Initialisation...");
// TODO: ajouter la logique métier
}
document.addEventListener("DOMContentLoaded", init);
EOF- Créez un fichier de configuration :
cat > config/app.conf << 'EOF'
# Configuration de l'application
APP_NAME=MonProjetWeb
APP_PORT=8080
APP_ENV=development
APP_DEBUG=true
LOG_LEVEL=info
LOG_FILE=/var/log/mon-projet.log
DB_HOST=localhost
DB_PORT=5432
DB_NAME=monprojet
EOF- Créez un fichier
.gitignore:
cat > .gitignore << 'EOF'
node_modules/
*.log
.env
dist/
.DS_Store
EOF- Vérifiez tous les fichiers créés :
find . -type f | sortRésultat attendu :
./.gitignore
./README.md
./config/app.conf
./src/css/style.css
./src/index.html
./src/js/app.jsÉtape 3 : Copier des Fichiers et Répertoires
Objectif : Maîtriser la copie de fichiers et dossiers
Instructions :
- Copiez le README dans le dossier
docs/:
cp README.md docs/- Vérifiez :
ls docs/Résultat attendu : README.md
- Copiez le fichier de config avec un nom différent (backup) :
cp config/app.conf config/app.conf.backup- Copiez tout le dossier
src/ensrc-backup/:
cp -r src/ src-backup/- Vérifiez que la copie est identique :
ls -la src/
ls -la src-backup/Les deux dossiers doivent avoir le même contenu.
Troubleshooting :
- Problème :
cp: omitting directory 'src'→ Vous avez oublié l'option-r(récursif) pour copier un dossier
Étape 4 : Déplacer et Renommer
Objectif : Utiliser mv pour déplacer et renommer
Instructions :
- Renommez le backup de configuration :
mv config/app.conf.backup config/app.conf.old- Vérifiez :
ls config/Résultat attendu :
app.conf app.conf.old- Créez un fichier temporaire et déplacez-le :
touch brouillon.txt
ls brouillon.txt
mv brouillon.txt docs/notes.txt
ls docs/Résultat attendu dans docs/ :
README.md notes.txtLe fichier a été déplacé et renommé en une seule commande.
- Déplacez le dossier backup dans
docs/:
mv src-backup/ docs/archive-src/- Vérifiez :
ls -la docs/Étape 5 : Lire le Contenu des Fichiers
Objectif : Utiliser les différentes commandes de lecture
Instructions :
- Afficher tout le contenu de
README.md:
cat README.md- Afficher avec les numéros de ligne :
cat -n src/index.html- Créez un fichier de log simulé pour tester
headettail:
for i in $(seq 1 50); do
echo "$(date '+%Y-%m-%d %H:%M:%S') - Ligne $i - Événement de test" >> logs/app.log
done- Afficher les 5 premières lignes :
head -n 5 logs/app.log- Afficher les 3 dernières lignes :
tail -n 3 logs/app.log- Compter les lignes du fichier :
wc -l logs/app.logRésultat attendu : 50 logs/app.log
- Tester
lesspour naviguer (appuyez surqpour quitter) :
less logs/app.logDans less :
- Flèches haut/bas : Naviguer ligne par ligne
- Espace : Page suivante
- b : Page précédente
- /mot : Rechercher "mot"
- q : Quitter
Étape 6 : Rechercher des Fichiers avec find
Objectif : Localiser des fichiers selon différents critères
Instructions :
- Trouver tous les fichiers
.htmldans le projet :
find . -name "*.html"Résultat attendu :
./src/index.html- Trouver tous les fichiers
.jset.css:
find . -name "*.js" -o -name "*.css"- Trouver tous les dossiers :
find . -type d- Trouver les fichiers modifiés dans les 10 dernières minutes :
find . -mmin -10- Trouver les fichiers de plus de 1 Ko :
find . -size +1k -type fÉtape 7 : Rechercher dans le Contenu avec grep
Objectif : Chercher du texte à l'intérieur des fichiers
Instructions :
- Chercher "TODO" dans tous les fichiers :
grep -r "TODO" .Résultat attendu :
./src/js/app.js: // TODO: ajouter la logique métier- Chercher "port" dans les fichiers de configuration (insensible à la casse) :
grep -ri "port" config/- Chercher "Événement" dans le log et compter les occurrences :
grep -c "Événement" logs/app.logRésultat attendu : 50
- Chercher dans le log et afficher le numéro de ligne :
grep -n "Ligne 42" logs/app.logÉtape 8 : Supprimer avec Précaution
Objectif : Supprimer des fichiers de manière contrôlée
Instructions :
- Supprimez le fichier de config backup :
rm config/app.conf.old
ls config/Résultat attendu : Seul app.conf reste.
- Supprimez l'archive dans docs :
rm -r docs/archive-src/
ls docs/- Supprimez le fichier de log :
rm logs/app.logBonne pratique : Avant un
rm -r, faites toujours unlsdu dossier cible pour vérifier son contenu.
Étape 9 : Nettoyage Final
Revenez dans votre home et supprimez le projet de test :
cd ~
rm -r mon-projet-web
ls mon-projet-webRésultat attendu :
ls: cannot access 'mon-projet-web': No such file or directory✅ Vérification Finale
Vérifiez que vous savez répondre à ces questions :
- Comment créer une arborescence de dossiers en une seule commande ? →
mkdir -p a/b/c - Comment écrire du contenu dans un fichier sans éditeur ? →
echo "texte" > fichieroucat > fichier << 'EOF' - Comment copier un dossier entier ? →
cp -r source/ destination/ - Comment chercher un mot dans tous les fichiers d'un dossier ? →
grep -r "mot" dossier/ - Quelle est la différence entre
>et>>? →>écrase le fichier,>>ajoute à la fin
📖 Pour Aller Plus Loin
- Essayez
locate(plus rapide quefindsi installé) :sudo apt install mlocate && sudo updatedb && locate "*.conf" - Explorez
xargspour combinerfindet des commandes :find . -name "*.log" | xargs wc -l - Testez
rsyncpour des copies avancées :rsync -av source/ destination/