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 -deletesans avoir vérifié la liste au préalable : lancez d'abord sans-deletepour valider les fichiers ciblés. - Confondre
>(écrase) et>>(ajoute) :>détruit le contenu existant du fichier. - Oublier
2>&1quand 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>&1fusionne 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.