Informatique
Linux - Commandes utiles

Création le 26/10/2025
Dernière mise à jour le 05/07/2026

⫶☰ Table des matières

Introduction

En utilisant occasionnellement la ligne de commande sur des serveurs, j'ai eu besoin d'un "pense-bête" pour retrouver rapidement les commandes utiles. J'ai fini par décider de le partager sur mon site, si jamais ça peut être utile à d'autres !

Cette liste est très adaptée à mes usages, et sans doute pas aux votres... Peut être vous servira-t-il de base !
Souvent, ce genre de besoin est remplit par des "cheat sheets"... mais je n'en ai jamais trouvé de suffisemment adaptée à mes besoins...

Le site de référence des cheat sheets en regroupe plusieurs pour la CLI Linux : 20 Commandline Cheat Sheets - Cheatography.com: Cheat Sheets For Every Occasion.


Opérations usuelles

Contenu fichier

cat, more, less

Quelles différences ?

Outil Scrolling Recherche
cat ❌ (sortie directement dans la console)
more 2 sens : entrée pour ligne suivante, espace pour page suivante, b pour page précédente
less 2 sens : idem more + flèches du clavier idem VI

A noter que less est utilisé pour toutes les pages man !

Article intéressant au sujet de ces 3 commandes : Viewing Files in Linux Using cat, more, and less | Baeldung on Linux

Il existe bat, qui apporte beaucoup d'améliorations dont la coloration syntaxique !
Voir le site officiel : sharkdp/bat: A cat(1) clone with wings.
Ou cet article sur le site de Stéphane Robert : bat, un cat survitaminé

Exploitation de logs

Les commandes head et tail pour voir contenu en début ou fin de fichier. Par défaut, les 2 commandes affichent 10 lignes, pour changer ce nombre utiliser -n <nb_lignes> ou simplement - <nb_lignes> (ancienne syntaxe).
Le paramètre f permet de rafraichir en continu, pratique pour suivre un log par exemple !

tail -2000f wildfly/standalone/log/server.log
tail -2000f wildfly/standalone/log/server.log | grep "fr.mycompany.product."

<commande> | head
<commande> | tail
<commande> | tail -n 100
    
watch <commande> # rafraichit l'affichage de la commande toutes les 2 secondes
# -d pour surligner les différences entre chaque rafraichissement
# -n <secondes> indique une période de rafraichissement personnalisée (le défaut est de 2s)
   
tail -f <fichier> | grep "chaine" | tee -a output.log # la sortie est affichée dans stdout et également envoyée dans output.log en append (paramètre a)

<commande> 2>&1 # renvoie stderr et stdout

Redirections

echo "Hello world" > fichier.txt # écrase
echo "Ligne 2" >> fichier.txt # ajoute à la fin

commande > output.log 2>&1 # redirige stdout ET stderr vers output.log

Un billet sur le blog de Korben listant ces redirection avec pas mal de détails : Shells Unix - 5 redirections que vous copiez sans comprendre - Korben

Contenu arborescence

Liste fichiers

ls -lh
# ls -l = ll (long listing)
# h = human readable : tailles en Ko, Mo, Go

ls -d my_dirs_*
# d = affiche uniquement les répertoires (et pas leur contenu)

Comptage

<commande> | wc -l

Paramètre l pour le nombre de lignes.

Analyse arborescence

Avec la commande tree on peut afficher le contenu d'une arborescence

tree -adugph ~/Documents/logs | less
# a = all
# d = uniquement répertoire
# l = suit les symlinks
# f = affiche le chemin complet
# L = nb max niveaux, exemple -L 2
# u = affiche user
# g = affiche group
# p = affiche type et permissions
# s = affiche la taille en octets
# h = affiche la taille "human readable"
# --du = taille cumulée
# c = trie par date dernière modif
# r = ordre inverse

Copie répertoire

cp -r /my_directory <target>

cp -ar source/. destination
# a = preserve file attrib + symlinks
# . = copie aussi fichiers / dossiers cachés

Les paramètres -r et -R sont équivalents, cf page man

Liens symboliques

Création lien symbolique :

ln -s target_directory symlink_name
# s = lien symbolique plutôt que physique
# target_directory = relatif à l'emplacement de symlink

ln -sr subdir/target_directory subdir/symlink_name
ln -s target_directory subdir/symlink_name
# r = target_directory relatif au répertoire courant (et non à l'emplacement du symlink)

Permissions

chmod +wx <fichier> # ajout à tous drois d'écriture et exécution
# options possibles :
# u = user (propriétaire)
# g = group
# o = others
# + / - / = (égal : écrase)
# r / w / x
chmod g+x <fichier> # droit d'exécution au groupe

chown -R www-data . # pour le dossier courant et récursivement change le groupe
chown -R www-data:www-data . # pour le dossier courant et récursivement change groupe et propriétaire

usermod -a -G www-data pierre # ajoute le groupe www-data à l'utilisateur pierre

Historique commandes

Sur le shell le raccourci Ctrl+R permet de rechercher dans l'historique des commandes. Indispensable !

Et d'autres commandes utiles :

history # historique des commandes
cd - # bascule sur le répertoire précédent
cd $OLDPWD # idem mais avec var d'env

Les variables d'environnement PWD et OLDPWD sont automatiquement remplies par le shell.

Une page sur le sujet : PWD vs OLDPWD – Bash environment variables – techPiezo

Avec le shell Fish, la commande cdh permet de parcourir l'historique des répertoires visités, cf le chapitre dédié dans la page personnalisation du shell


Recherche fichiers

Find

Un outil destiné à trouver des fichiers à partir de leurs attributs.
Les options :

Valeur avec + pour >, - pour <, et rien pour valeur exacte.

Autres options :

find /my_directory -mtime
find /my_directory -name <name>

# Fichiers modifiés pendant les dernières 180min
# le -exec pour afficher les noms de fichiers contenant la chaine <string>
find /my_directory -mmin -180 -type f -exec grep -l '<string>' {} +

# Fichiers modifiés il y a au moins 183 jours ou plus
# le -exec pour déplacer chaque fichier trouvé dans un répertoire _archive
find . -maxdepth 1 -type f -mtime +183 -exec mv {} _archive/ \;

Pour aller plus loin, le toujours excellent Stéphane Robert a une page parfaite sur l'outil : Maîtriser Find : Recherche Linux efficace

Grep

Cet outil-ci est destiné à trouver des fichiers à partir de leur contenu.

grep "<chaine>" <sources_sep_space>
grep -l <chaine> <file>
grep -rn <file> -e "<pattern>"
# l = liste fichiers
# r = recursive
# i = not case sensitive
# n = affiche le no de ligne
# C n = affiche n lignes avant et après l'occurrence
# c = compte le nb d'occurrences, liste chaque fichier

# Déplacer les fichiers trouvés :
grep -lir <chaine>" <source> | xargs mv -t <dest>

zgrep : recherche dans les fichiers normaux mais aussi les archives gzip !
Les paramètres sont les mêmes.

Références sur l'outil :

Disque et fichiers

Info fichiers

stat <fichier> # infos dont le type (fichier, répertoire, symlink), les dates, ...

Stats espace disque

Espace disponible et occupé sur les différents points de montage :

df -h
df -h /my_directory

Espace occupé dans les différents sous-répertoires, avec total :

du -sch *
du -sch dir1/ dir2/ dir3/
du -sch * --exclude=/my_directory

Espace par sous répertoire éclaté, trié par ordre croissant :

du -Sm | sort -n

Stats sur les iNodes :

df -i

Ménage disque

Suppression de répertoire (paramètre r=récursif, f=force) :

rm -rf /my_directory

L'utilitaire TUI ncdu est très pratique pour visualiser l'espace occupé dans une hiérarchie de répertoires.

Tâches de nettoyage à effectuer régulièrement :

# 1️⃣ vérifier le volume de logs !
du -sh /var/log

# 2️⃣ Docker
docker system df # regarder en particulier build cache
docker system prune # ⚠️attention va supprimer aussi les container arrêtés !
docker builder prune --all # juste le build cache
docker image prune -a
docker volume prune

docker images
docker rmi <id_ou_tag>

# 3️⃣ apt
sudo apt autoremove
sudo apt autoclean
# on peut avoir par exemple sa partition /boot qui déborde suite à une maj de noyau

Archives

Création

Création d'une archive gzip pour un fichier :

Par défaut la commande gzip va supprimer le fichier source en fin de traitement

gzip fichier_source.log
gzip -9 <fichier>
# 1..9 : niveau de compression, 9 pour le max, défaut 6
# r = recursive
# v = verbose
# k = conserve le fichier source

cat data3673693003010299638.data.xml | gzip -9 > /tmp/grosxml.gz
mysqldump database_name | gzip -c > database_name.sql.gz

Création d'une archive tar compressée :

tar -czvf <dest>.tar.gz <source>
# c = create
# z = ajoute la compression gzip
# v = verbose
# f = utilise le fichier donné en paramètre

Décompression

unzip file.zip -d my_directory

gzip -d file.gz
# d = extrait (identique à gunzip)
gunzip file.gz
gunzip *.gz
# k = conserver archive
# r = recursive
# l = liste les fichiers
# lv = list verbose

find . -name "*.gz" -exec gunzip {} \;

Extraction d'un .tar.gz :

tar -xvf <archive>
# x = extrait une archive

Serveur

Transferts

SCP

L'utilitaire SCP permet de transférer des fichiers à une machine sur laquelle on a un accès SSH.

# ⬆️ Sens montant
scp /file/to/send username@remote:/where/to/put/remotely
scp -P 10022 <file> myuser@mymachine.fr:/tmp 
# -P : n° port si différent du 22 par défaut
# -r : récursif (permet de transférer des répertoires)
# -c : compression

# ⬇️ Sens descendant
scp username@remote:/file/to/receive /where/to/put/locally
scp username@remote_1:/file/to/get username@remote_2:/where/to/put

Si ses configurations de connexion SSH sont sauvegardées dans ~/.ssh/config, on peut se connecter avec le nom de la configuration plutôt que l'url complète : scp /file/to/send my_config:/where/to/put/remotely

On peut aussi se connecter avec son gestionnaire de fichier avec une URL fish:// si la machine accepte ce protocole.
Cf chapitre consacré à Dolphin dans la page Gnome.

Une excellente référence sur SCP est présente sur le site de Stéphane Robert : SCP : transfert de fichiers sécurisé

rsync

De son côté rsync est un utilitaire de... synchronisation, comme son nom l'indique !

rsync -e "ssh -p 10022" -avnz <source> <dest>
# -e : remote shell program to use (permet de spécifier un port ssh différent)
# a = all
# v = verbose
# n = dry run
# z = compress
# i = itemize-changes (liste chg sur les fichiers)
# c = comp sur taille plutôt que date
# --exclude /chemin/du/dossier/ (avec / relatif à source)

Une excellente documentation de rsync est disponible sur ubuntu-fr : rsync [Wiki ubuntu-fr]

Daemon

sudo systemctl disable mariadb # arrête le démarrage automatique au boot de la machine
sudo systemctl stop mariadb apache2
sudo systemctl start mariadb apache2
sudo systemctl status mariadb apache2

Enchaînement de commandes

Particulièrement utile dans un DockerFile ou pour une CI !

commande & # lance en arrière plan
commande1 && commande2 && commande3 # chaîne plusieurs commandes, arrêt si erreur
commande1 || commande2 || commande 3 # chaîne plusieurs commande, arrêt si succès
commande1 ; commande2 ; commande3 # chaine quelque soit le code de retour

echo $? # code retour dernière commande (BASH)
echo $status # idem dans Fish

Processus

Liste

ps aux
ps -afu my_user

Les paramètres de ps :

La liste des process par user peut être utile pour lister les cron toujours en cours !
Pour éditer la crontab :

crontab -e

Monitoring

htop # TUI de visualisation des processus et des resources utilisées, avec tri, filtre, etc
htop -F borg # directement positionné sur un processus précis

iotop # idem pour les I/O !

Développement

Docker

docker logs -f <nom_container>
    
docker exec -ti <nom_container> bash
# t = allocate tty
# i = interactive

docker compose build # construit uniquement les images
docker compose pull # maj des images

docker compose up # build + run images
docker compose up -d # d = detached
docker compose start # démarrage des containers existants uniquement

docker compose ps # état des services

docker compose stop # arrêt SANS suppr containers
docker compose down # arrêt AVEC suppr containers
docker compose rm # suppr container arrêtés

Bien faire attention entre les 2 commandes d'arrêt !
stop = simple arrêt de service
down = détruit tout (containers, réseaux, volumes associés) !

Performances

time my_script.sh

L'utilitaire hyperfine permet de lancer plusieurs fois une commande et d'obtenir des statistiques sur les temps d'exécution.


VI

VI, VIM, NeoVim ?

Formé à VI pendant les études, je l'ai utilisé pendant des années (décennies ?). Mais en fait, j'ai fini par me poser la question d'utiliser d'autres éditeurs dont j'entendais les noms de plus en plus.

Pour faire simple :

VI
L'ancètre, apparu en 1976 (!!)
VIM
Clone apparu en 1991. Apporte principalement la coloration syntaxique et l'indentation automatique !
Pour plus de détails sur les différences, voir Différences entre vi et vim — Documentation Fedora-Fr
NeoVim
Tout récent (le site officiel a un tld en .io même ! :o) ), ce clone est apparu en 2014.
La documentation du logiciel détaille les différences avec VIM : Vim_diff - Neovim docs

Sur mon poste de travail j'utilise majoritairement des éditeurs ou IDE graphiques, et sur tous les serveurs que j'utilise VIM est présent à contrario de NeoVIM : c'est donc lui que j'utilise maintenant !

Une bonne référence sur VIM est présente sur le site de Stéphane Robert : Vim pour l'administration (certif)

Commandes

Il existe même des easters eggs dans VIM : Découvert grace à ce chouette billet du blog de Korben : Les meilleurs easter eggs cachés dans vos langages et outils de développeurs

Comparer 2 fichiers avec vimdiff

Très pratique en particulier sur un serveur ! L'usage est ultra simple :

vimdiff fichier1.txt fichier2.txt

Avec fichier1 affiché à gauche et fichier2 à droite. Les commandes VIM classiques sont alors utilisables.


Resources

index — Debian Manpages
Les pages man accessibles en ligne
tldr pages
Un équivalent de man mais qui donne des exemples d'usage synthétiques plutôt que de la documentation détaillée
projets:ecole:scripting:initiation_au_shell [Wiki ubuntu-fr]
Excellent guide d'apprentissage chez Ubuntu FR !
C'est quoi un Shell ?
Un autre guide sur le site du toujours excellent Stéphane Robert : de quoi apprendre toutes les bases !
phyver/GameShell: a game to learn (or teach) how to use standard commands in a Unix shell
Un jeu pour apprendre à utiliser les commandes de base d'un shell Unix... à exécuter directement dans le terminal !

Un oubli, une erreur, une suggestion ? Rendez-vous sur le dépôt GitHub !