Réorganiser les guides et ajouter architecture filesystem
- Nouvelle structure : linux-essentials/ et forgejo/ - Nouveau guide : architecture-filesystem.md (comprendre /etc, /var, etc.) - Déplacement et renommage des guides existants - README pour chaque dossier - Suppression des sections auteurs Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
4e99c5025c
commit
e33395dc35
10 changed files with 2811 additions and 17 deletions
566
serveur/linux-essentials/comprendre-commandes-find-du.md
Normal file
566
serveur/linux-essentials/comprendre-commandes-find-du.md
Normal file
|
|
@ -0,0 +1,566 @@
|
|||
# Comprendre les commandes de diagnostic (find, du, grep)
|
||||
|
||||
Guide pédagogique pour comprendre les commandes utilisées dans le diagnostic du cache Forgejo.
|
||||
|
||||
---
|
||||
|
||||
## 1. La commande `find` : Chercher des fichiers
|
||||
|
||||
### Syntaxe de base
|
||||
|
||||
```bash
|
||||
find [où chercher] [critères] [action]
|
||||
```
|
||||
|
||||
### Exemples progressifs
|
||||
|
||||
**Exemple 1 : Lister tous les fichiers d'un dossier**
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
**Ce que ça fait :**
|
||||
- Parcourt récursivement tout le dossier `repo-archive`
|
||||
- Affiche tous les fichiers ET dossiers trouvés
|
||||
|
||||
---
|
||||
|
||||
**Exemple 2 : Seulement les fichiers (pas les dossiers)**
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f
|
||||
```
|
||||
|
||||
**Nouveau paramètre :**
|
||||
- `-type f` : Filtre pour garder seulement les **f**ichiers (file)
|
||||
- `-type d` : Pour les **d**ossiers (directory)
|
||||
|
||||
---
|
||||
|
||||
**Exemple 3 : Compter les fichiers**
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f | wc -l
|
||||
```
|
||||
|
||||
**Décortiquons :**
|
||||
- `find ... -type f` : Trouve tous les fichiers
|
||||
- `|` : "Pipe" = envoie le résultat à la commande suivante
|
||||
- `wc -l` : **W**ord **C**ount avec `-l` (line) = compte les lignes
|
||||
|
||||
**Résultat :** Le nombre de fichiers trouvés (ex: `1189`)
|
||||
|
||||
---
|
||||
|
||||
### Filtres par date : `-mtime`, `-mmin`
|
||||
|
||||
**Les 3 formes :**
|
||||
|
||||
| Syntaxe | Signification | Exemple |
|
||||
|---------|---------------|---------|
|
||||
| `-mtime -1` | Modifié **moins de** 24h | Fichiers créés aujourd'hui |
|
||||
| `-mtime 0` | Modifié **il y a exactement** 24h | Fichiers d'hier |
|
||||
| `-mtime +1` | Modifié **plus de** 48h | Fichiers d'avant-hier ou plus |
|
||||
|
||||
**Note importante :**
|
||||
- `-mtime` compte en **jours entiers** (multiples de 24h)
|
||||
- `-mtime +1` signifie "plus de 1 jour complet" donc **≥ 2 jours** (48h)
|
||||
|
||||
**Pour plus de précision, utilisez `-mmin` (minutes) :**
|
||||
|
||||
| Syntaxe | Signification |
|
||||
|---------|---------------|
|
||||
| `-mmin -60` | Modifié dans les 60 dernières minutes (< 1h) |
|
||||
| `-mmin +360` | Modifié il y a plus de 360 minutes (> 6h) |
|
||||
|
||||
**Exemple pratique :**
|
||||
```bash
|
||||
# Fichiers de moins de 6 heures
|
||||
find repo-archive -type f -mmin -360
|
||||
|
||||
# Fichiers de plus de 6 heures
|
||||
find repo-archive -type f -mmin +360
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### L'opérateur `!` (NOT)
|
||||
|
||||
**Inverser une condition :**
|
||||
|
||||
```bash
|
||||
find repo-archive -type f ! -mtime -1
|
||||
```
|
||||
|
||||
**Signification :**
|
||||
- `-mtime -1` : Fichiers de moins de 24h
|
||||
- `!` : **NOT** (inverse la condition)
|
||||
- Résultat : Fichiers de **PLUS de 24h**
|
||||
|
||||
**Équivalent :**
|
||||
- `! -mtime -1` = `-mtime 0 -o -mtime +1` (24h-48h OU plus de 48h)
|
||||
|
||||
---
|
||||
|
||||
### La commande `-exec` : Exécuter une action sur chaque fichier
|
||||
|
||||
**Syntaxe :**
|
||||
```bash
|
||||
find [critères] -exec commande {} \;
|
||||
```
|
||||
|
||||
**Composants :**
|
||||
- `-exec` : Exécute une commande sur chaque fichier trouvé
|
||||
- `commande` : La commande à exécuter (ex: `ls`, `du`, `rm`)
|
||||
- `{}` : Remplacé par le chemin du fichier trouvé
|
||||
- `\;` : Marque la fin de la commande (obligatoire)
|
||||
|
||||
**Exemple 1 : Afficher les détails de chaque fichier**
|
||||
```bash
|
||||
find repo-archive -type f -exec ls -lh {} \;
|
||||
```
|
||||
|
||||
**Ce qui se passe :**
|
||||
1. `find` trouve le fichier `/path/to/file1.zip`
|
||||
2. Exécute : `ls -lh /path/to/file1.zip`
|
||||
3. Trouve le fichier `/path/to/file2.zip`
|
||||
4. Exécute : `ls -lh /path/to/file2.zip`
|
||||
5. Etc.
|
||||
|
||||
---
|
||||
|
||||
**Exemple 2 : Supprimer tous les fichiers trouvés**
|
||||
```bash
|
||||
find repo-archive -type f -mmin +360 -exec rm {} \;
|
||||
```
|
||||
|
||||
**⚠️ Attention :** Cette commande **supprime définitivement** les fichiers.
|
||||
|
||||
**Équivalent plus simple :**
|
||||
```bash
|
||||
find repo-archive -type f -mmin +360 -delete
|
||||
```
|
||||
|
||||
L'option `-delete` est plus rapide et sûre que `-exec rm`.
|
||||
|
||||
---
|
||||
|
||||
### Différence entre `\;` et `+`
|
||||
|
||||
```bash
|
||||
# Avec \; : Exécute la commande UNE FOIS par fichier (lent)
|
||||
find repo-archive -type f -exec du -h {} \;
|
||||
# → du -h file1.zip
|
||||
# → du -h file2.zip
|
||||
# → du -h file3.zip
|
||||
|
||||
# Avec + : Exécute la commande UNE FOIS avec TOUS les fichiers (rapide)
|
||||
find repo-archive -type f -exec du -h {} +
|
||||
# → du -h file1.zip file2.zip file3.zip
|
||||
```
|
||||
|
||||
**Utilisez `+` quand possible, c'est beaucoup plus rapide.**
|
||||
|
||||
---
|
||||
|
||||
### La commande `-printf` : Format personnalisé
|
||||
|
||||
**Afficher des informations personnalisées :**
|
||||
|
||||
```bash
|
||||
find repo-archive -type f -printf '%TY-%Tm-%Td\n'
|
||||
```
|
||||
|
||||
**Composants :**
|
||||
- `-printf` : Affiche un format personnalisé (au lieu du nom du fichier)
|
||||
- `%T` : Date de modification du fichier
|
||||
- `%TY` : Année (2026)
|
||||
- `%Tm` : Mois (02)
|
||||
- `%Td` : Jour (05)
|
||||
- `\n` : Saut de ligne
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
2026-02-03
|
||||
2026-02-03
|
||||
2026-02-04
|
||||
2026-02-04
|
||||
...
|
||||
```
|
||||
|
||||
**Formater avec l'heure :**
|
||||
```bash
|
||||
find repo-archive -type f -printf '%TY-%Tm-%Td %TH:%TM\n'
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
2026-02-03 14:23
|
||||
2026-02-03 14:45
|
||||
2026-02-04 08:12
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. La commande `du` : Disk Usage (taille des fichiers)
|
||||
|
||||
### Syntaxe de base
|
||||
|
||||
```bash
|
||||
du [options] [chemin]
|
||||
```
|
||||
|
||||
### Options courantes
|
||||
|
||||
| Option | Signification | Exemple |
|
||||
|--------|---------------|---------|
|
||||
| `-s` | **S**ummary (résumé total) | Affiche seulement le total |
|
||||
| `-h` | **H**uman-readable (Go, Mo) | `5.2G` au lieu de `5242880` |
|
||||
| `-b` | **B**ytes (octets exacts) | Pour des calculs précis |
|
||||
| `-c` | **C**umulé (total à la fin) | Ajoute une ligne de total |
|
||||
|
||||
### Exemples
|
||||
|
||||
**Voir la taille d'un dossier :**
|
||||
```bash
|
||||
du -sh /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
47G /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Voir la taille de chaque sous-dossier :**
|
||||
```bash
|
||||
du -sh /home/debian/forgejo/data/gitea/*
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
4.0K /home/debian/forgejo/data/gitea/actions_artifacts
|
||||
8.0K /home/debian/forgejo/data/gitea/conf
|
||||
47G /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Taille en octets (pour des comparaisons) :**
|
||||
```bash
|
||||
du -sb /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
50465865728 /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
**Utilité :** Pour comparer avec un seuil (ex: 10G = 10737418240 octets)
|
||||
|
||||
---
|
||||
|
||||
### Utiliser `du` avec `find`
|
||||
|
||||
**Calculer la taille totale des fichiers trouvés :**
|
||||
|
||||
```bash
|
||||
find repo-archive -type f -exec du -ch {} + | tail -1
|
||||
```
|
||||
|
||||
**Décortiquons :**
|
||||
1. `find repo-archive -type f` : Trouve tous les fichiers
|
||||
2. `-exec du -ch {} +` : Calcule la taille de chaque fichier
|
||||
- `-c` : Affiche un total à la fin
|
||||
- `-h` : Format lisible (Go, Mo)
|
||||
- `+` : Passe tous les fichiers en une fois (rapide)
|
||||
3. `| tail -1` : Garde seulement la dernière ligne (le total)
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
47G total
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Pipeline de commandes avec `|`
|
||||
|
||||
### Concept du pipe `|`
|
||||
|
||||
Le pipe `|` envoie le **résultat** d'une commande à l'**entrée** de la suivante.
|
||||
|
||||
```bash
|
||||
commande1 | commande2 | commande3
|
||||
```
|
||||
|
||||
**Exemple concret :**
|
||||
```bash
|
||||
find repo-archive -type f | wc -l
|
||||
```
|
||||
|
||||
**Ce qui se passe :**
|
||||
1. `find` affiche tous les fichiers (un par ligne)
|
||||
2. `|` envoie cette liste à `wc`
|
||||
3. `wc -l` compte le nombre de lignes
|
||||
|
||||
---
|
||||
|
||||
### Chaînes courantes
|
||||
|
||||
**Compter + Trier :**
|
||||
```bash
|
||||
docker logs forgejo --since 24h | grep "archive" | wc -l
|
||||
```
|
||||
|
||||
**Étapes :**
|
||||
1. `docker logs forgejo --since 24h` : Affiche les logs des 24 dernières heures
|
||||
2. `grep "archive"` : Garde seulement les lignes contenant "archive"
|
||||
3. `wc -l` : Compte combien de lignes
|
||||
|
||||
---
|
||||
|
||||
**Extraire + Compter + Trier :**
|
||||
```bash
|
||||
docker logs forgejo --since 24h | grep "archive" | grep -oP '\d+\.\d+\.\d+\.\d+' | sort | uniq -c | sort -rn | head -5
|
||||
```
|
||||
|
||||
**Étapes détaillées :**
|
||||
1. `docker logs forgejo --since 24h` : Logs des 24h
|
||||
2. `grep "archive"` : Lignes avec "archive"
|
||||
3. `grep -oP '\d+\.\d+\.\d+\.\d+'` : Extrait les adresses IP (regex)
|
||||
4. `sort` : Trie les IP alphabétiquement
|
||||
5. `uniq -c` : Compte les occurrences de chaque IP unique
|
||||
6. `sort -rn` : Trie par nombre décroissant
|
||||
7. `head -5` : Garde les 5 premières
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
2144 216.73.216.118
|
||||
42 192.168.1.100
|
||||
12 10.0.0.5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Commandes complémentaires
|
||||
|
||||
### `sort` : Trier
|
||||
|
||||
| Option | Signification |
|
||||
|--------|---------------|
|
||||
| `-h` | Trie en mode "humain" (comprend 10G > 2G) |
|
||||
| `-r` | **R**everse (ordre décroissant) |
|
||||
| `-n` | **N**umérique (trie les nombres correctement) |
|
||||
| `-rn` | Numérique décroissant |
|
||||
|
||||
**Exemple :**
|
||||
```bash
|
||||
du -sh /var/* | sort -h
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `uniq` : Dédoublonner
|
||||
|
||||
| Option | Signification |
|
||||
|--------|---------------|
|
||||
| `-c` | **C**ount (compte les occurrences) |
|
||||
|
||||
**Important :** `uniq` ne fonctionne que sur des données **triées**.
|
||||
|
||||
```bash
|
||||
# ❌ Mauvais (données non triées)
|
||||
echo -e "a\nb\na" | uniq -c
|
||||
|
||||
# ✅ Bon (trier d'abord)
|
||||
echo -e "a\nb\na" | sort | uniq -c
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `head` / `tail` : Garder les premières/dernières lignes
|
||||
|
||||
```bash
|
||||
# Garder les 10 premières lignes
|
||||
command | head -10
|
||||
|
||||
# Garder les 10 dernières lignes
|
||||
command | tail -10
|
||||
|
||||
# Garder seulement la dernière ligne
|
||||
command | tail -1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Exemples complets avec explications
|
||||
|
||||
### Exemple 1 : Trouver les gros fichiers
|
||||
|
||||
**Commande :**
|
||||
```bash
|
||||
find /home -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h | tail -20
|
||||
```
|
||||
|
||||
**Décortiquons pas à pas :**
|
||||
|
||||
| Partie | Rôle |
|
||||
|--------|------|
|
||||
| `find /home` | Cherche dans /home |
|
||||
| `-type f` | Seulement les fichiers |
|
||||
| `-size +100M` | Plus de 100 MB |
|
||||
| `-exec ls -lh {} \;` | Affiche les détails de chaque fichier trouvé |
|
||||
| `2>/dev/null` | Masque les erreurs (permissions refusées) |
|
||||
| `sort -k5 -h` | Trie par la 5ème colonne (taille) en mode humain |
|
||||
| `tail -20` | Garde les 20 derniers = les plus gros |
|
||||
|
||||
---
|
||||
|
||||
### Exemple 2 : Distribution des fichiers par date
|
||||
|
||||
**Commande :**
|
||||
```bash
|
||||
find repo-archive -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
|
||||
```
|
||||
|
||||
**Décortiquons :**
|
||||
|
||||
| Partie | Rôle |
|
||||
|--------|------|
|
||||
| `find repo-archive -type f` | Trouve tous les fichiers |
|
||||
| `-printf '%TY-%Tm-%Td\n'` | Affiche la date de chaque fichier (format YYYY-MM-DD) |
|
||||
| `sort` | Trie les dates |
|
||||
| `uniq -c` | Compte combien de fichiers par date |
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
676 2026-02-03
|
||||
513 2026-02-04
|
||||
```
|
||||
|
||||
**Interprétation :** 676 fichiers créés le 3 février, 513 le 4 février.
|
||||
|
||||
---
|
||||
|
||||
### Exemple 3 : Taille totale des fichiers récents
|
||||
|
||||
**Commande :**
|
||||
```bash
|
||||
find repo-archive -type f -mtime -1 -exec du -ch {} + | tail -1
|
||||
```
|
||||
|
||||
**Décortiquons :**
|
||||
|
||||
| Partie | Rôle |
|
||||
|--------|------|
|
||||
| `find repo-archive -type f` | Trouve tous les fichiers |
|
||||
| `-mtime -1` | Modifiés dans les dernières 24h |
|
||||
| `-exec du -ch {} +` | Calcule la taille avec total à la fin |
|
||||
| `tail -1` | Garde la dernière ligne (le total) |
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
5.9G total
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Cas pratique : Diagnostic du cache Forgejo
|
||||
|
||||
**Objectif :** Comprendre pourquoi le cache fait 47G.
|
||||
|
||||
### Étape 1 : Taille totale
|
||||
|
||||
```bash
|
||||
du -sh /home/debian/forgejo/data/gitea/repo-archive
|
||||
```
|
||||
|
||||
**Résultat :** `47G`
|
||||
|
||||
---
|
||||
|
||||
### Étape 2 : Nombre de fichiers
|
||||
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f | wc -l
|
||||
```
|
||||
|
||||
**Résultat :** `1189 fichiers`
|
||||
|
||||
---
|
||||
|
||||
### Étape 3 : Distribution par date
|
||||
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
676 2026-02-03
|
||||
513 2026-02-04
|
||||
```
|
||||
|
||||
**Interprétation :** Tous les fichiers datent de 2-3 jours. Le cron n'a pas nettoyé ou les bots régénèrent constamment.
|
||||
|
||||
---
|
||||
|
||||
### Étape 4 : Taille des fichiers récents vs anciens
|
||||
|
||||
**Fichiers de moins de 24h :**
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f -mtime -1 | wc -l
|
||||
```
|
||||
**Résultat :** `239 fichiers`
|
||||
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f -mtime -1 -exec du -ch {} + | tail -1
|
||||
```
|
||||
**Résultat :** `5.9G`
|
||||
|
||||
---
|
||||
|
||||
**Fichiers de plus de 24h :**
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f ! -mtime -1 | wc -l
|
||||
```
|
||||
**Résultat :** `957 fichiers`
|
||||
|
||||
```bash
|
||||
find /home/debian/forgejo/data/gitea/repo-archive -type f ! -mtime -1 -exec du -ch {} + | tail -1
|
||||
```
|
||||
**Résultat :** `42G`
|
||||
|
||||
---
|
||||
|
||||
**Conclusion :**
|
||||
- 239 fichiers récents (24h) = 5.9G → **Normal**
|
||||
- 957 fichiers anciens (24h+) = 42G → **PROBLÈME** (auraient dû être supprimés)
|
||||
|
||||
**Cause :** Le cron ne s'est pas exécuté OU Fail2ban n'a pas banni les bots assez vite.
|
||||
|
||||
---
|
||||
|
||||
## Résumé des commandes essentielles
|
||||
|
||||
```bash
|
||||
# Taille d'un dossier
|
||||
du -sh /path/to/folder
|
||||
|
||||
# Nombre de fichiers
|
||||
find /path -type f | wc -l
|
||||
|
||||
# Taille totale des fichiers
|
||||
find /path -type f -exec du -ch {} + | tail -1
|
||||
|
||||
# Fichiers de plus de 6h
|
||||
find /path -type f -mmin +360
|
||||
|
||||
# Supprimer fichiers de plus de 6h
|
||||
find /path -type f -mmin +360 -delete
|
||||
|
||||
# Distribution par date
|
||||
find /path -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
|
||||
|
||||
# Top 20 gros fichiers
|
||||
find /path -type f -size +100M -exec ls -lh {} \; | sort -k5 -h | tail -20
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue