Polarys

Recherche & filtres

find, pipes et redirections

find, pipes et redirections

grep filtre du texte, mais comment trouver des fichiers selon leur nom, date ou taille ? Et comment combiner plusieurs commandes pour en faire une pipeline d'analyse ? Ce sont les deux super-pouvoirs du shell Linux : maîtrisez-les et vous réaliserez en une ligne ce qui prendrait des heures manuellement.

find : trouver des fichiers

find /var/log -name "*.log"              # par nom (glob)
find /home -name "*.bak" -type f         # seulement des fichiers (-type f)
find /tmp -type d                         # seulement des dossiers (-type d)
find /var/log -mtime -1                   # modifiés dans les dernières 24h
find /var/log -mtime +30                  # modifiés il y a plus de 30 jours
find /var/www -size +10M                  # plus de 10 Mo
find /var/www -size +100M -delete         # trouver ET supprimer (ATTENTION)
find /etc -name "*.conf" -newer /etc/hosts # plus récents que /etc/hosts

Exécuter une commande sur chaque résultat

find /var/log -name "*.log" -exec ls -lh {} \;
find /tmp -mtime +7 -exec rm {} \;       # supprimer les fichiers de plus de 7 jours

Les pipes | : enchaîner des commandes

Le pipe | envoie la sortie d'une commande vers l'entrée de la suivante. C'est comme assembler des briques LEGO :

commande1 | commande2 | commande3

Exemples pratiques :

# Lister les 10 plus gros fichiers de /var/log
find /var/log -type f | xargs ls -lS | head -10

# Compter les connexions SSH par IP
grep "Accepted" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

# Chercher un processus et filtrer
ps aux | grep apache2 | grep -v grep

Redirections : sauvegarder les sorties

commande > fichier        # écrase le fichier (stdout)
commande >> fichier       # ajoute à la fin du fichier
commande 2> erreurs.txt   # redirige les erreurs (stderr)
commande 2>&1             # fusionne stderr dans stdout
commande > sortie.txt 2>&1  # tout dans le même fichier
commande 2>/dev/null      # jette les erreurs (poubelle)

Exemples concrets :

# Sauvegarder la liste des utilisateurs
cat /etc/passwd > /tmp/users-backup.txt

# Ajouter des logs sans écraser
echo "Démarrage script $(date)" >> /var/log/mon-script.log

# Lancer un script et ne voir que les erreurs
./deploy.sh > /dev/null 2> erreurs-deploy.txt

Cas concret

Le disque du serveur GLPI est plein. Vous devez identifier rapidement les gros fichiers et les anciens logs :

# 1. Voir l'espace disque
df -h

# 2. Trouver les dossiers les plus lourds
du -sh /var/* | sort -rh | head -10

# 3. Trouver les fichiers .log de plus de 50 Mo
find /var/log -name "*.log" -size +50M -exec ls -lh {} \;

# 4. Archiver les logs de plus de 30 jours
find /var/log/glpi -mtime +30 -name "*.log" > /tmp/vieux-logs.txt
# Vérifier la liste avant de supprimer !
cat /tmp/vieux-logs.txt
# Puis supprimer
find /var/log/glpi -mtime +30 -name "*.log" -delete
graph LR
  FIND["find /var/log<br/>-size +50M"] -->|"pipe |"| XARGS["xargs ls -lh"]
  XARGS -->|"pipe |"| SORT["sort -rh"]
  SORT -->|"redirection >"| FILE["rapport-logs.txt"]

  CMD["./script.sh"] -->|"stdout >"| OUT["sortie.txt"]
  CMD -->|"stderr 2>"| ERR["erreurs.txt"]

Erreurs fréquentes

  • Utiliser find -delete sans avoir vérifié la liste au préalable : lancez d'abord sans -delete pour valider les fichiers ciblés.
  • Confondre > (écrase) et >> (ajoute) : > détruit le contenu existant du fichier.
  • Oublier 2>&1 quand on veut capturer les erreurs dans le fichier de sortie : par défaut, les erreurs vont toujours dans le terminal même avec >.

À retenir

  • find / -name "*.log" -mtime +30 → fichiers log de plus de 30 jours.
  • commande1 | commande2 → la sortie de cmd1 devient l'entrée de cmd2.
  • > écrase, >> ajoute, 2>&1 fusionne erreurs et sortie standard.

Mini-exercice

Tapez find /etc -name "*.conf" -type f | wc -l pour compter les fichiers de configuration sur votre système. Puis find /etc -name "*.conf" -newer /etc/hosts pour voir lesquels ont été modifiés après le fichier hosts.

Quiz de validation

Quiz - 8 questions

1. Quelle commande find cherche les fichiers de plus de 30 jours dans /var/log ?

2. Que fait l'opérateur | (pipe) entre deux commandes ?

3. Quelle différence entre '>' et '>>' en redirection ?

4. Quelle commande permet de trouver tous les fichiers .bak dans /home et de les supprimer ?

5. Vous lancez './deploy.sh' et voulez sauvegarder uniquement les erreurs dans un fichier. Quelle syntaxe utilisez-vous ?

6. Quelle pipeline affiche les 5 fichiers les plus récemment modifiés dans /var/log ?

7. Un script génère beaucoup de messages de debug inutiles sur stderr. Comment les ignorer pour ne voir que la sortie normale ?

8. Quelle commande trouve les fichiers de plus de 100 Mo dans /var/www et affiche leur taille lisible ?

Suis ta progression

Crée un compte gratuit pour suivre ta progression et accéder à toutes les leçons.