Linux / Commande ls : lire les fichiers, droits, tailles et dates

ls affiche les noms de fichiers et le contenu des répertoires ; ls -lah ajoute les éléments cachés, les métadonnées et des tailles lisibles. Utilisez ls -ld chemin pour examiner un répertoire lui-même plutôt que son contenu, et un outil comme find pour traiter des noms de fichiers dans un script sans analyser une présentation destinée à l’écran.

Choisir les éléments à afficher

Les exemples concernent GNU ls, fourni par GNU Coreutils sur de nombreuses distributions Linux. Sans chemin, la commande examine le répertoire courant. Un argument désignant un fichier permet d’examiner ce fichier ; un argument désignant un répertoire affiche normalement son contenu, sans descendre récursivement.

ls
ls -l -- /etc/hosts
ls -- /etc /usr/local

Les chemins d’exemple doivent exister sur votre système. Le séparateur -- marque la fin des options : il aide notamment lorsqu’un nom commence par un tiret. Pour vérifier ce que votre shell appelle réellement et la version disponible :

type -a ls
ls --version

Inclure les noms cachés avec -a ou -A

ls -a
ls -A

Par défaut, les noms commençant par un point sont masqués dans la liste d’un répertoire. -a les inclut, avec . pour le répertoire courant et .. pour son parent. -A inclut les autres noms cachés mais omet ces deux entrées particulières.

Un nom caché n’est pas protégé par son point initial : cet affichage ne décrit pas à lui seul ses droits d’accès.

Examiner le répertoire lui-même avec -d

ls -ld -- .
ls -ld -- /var/log

-d demande une information sur l’argument répertoire lui-même, comme pour les autres types de fichiers. Avec -l, vous pouvez ainsi lire ses permissions, son propriétaire et ses horodatages, sans lister tout ce qu’il contient.

La forme ls -ld -- */ dépend aussi du shell : dans la configuration Bash habituelle, le motif exclut les noms cachés et peut inclure des liens vers des répertoires. Sans correspondance, le motif peut rester littéral et provoquer une erreur. Ce raccourci visuel ne constitue pas un inventaire général indépendant des options du shell.

Lire la sortie longue de ls -l

ls -l
ls -ln

La première commande utilise le format long ; -n demande des identifiants numériques d’utilisateur et de groupe au lieu de leurs noms. L’ordre habituel des informations est le suivant, sous réserve d’options qui ajoutent ou retirent des colonnes :

Champ Interprétation
Type et mode Un caractère de type, puis les bits de permissions et éventuellement un indicateur de mécanisme d’accès supplémentaire.
Nombre de liens physiques Nombre de liens physiques vers le fichier ; ce n’est pas un compteur général des fichiers contenus dans un répertoire.
Propriétaire et groupe Noms des comptes ou identifiants numériques d’utilisateur (UID) et de groupe (GID).
Taille Pour un fichier ordinaire, normalement sa taille logique en octets, sauf changement d’unité d’affichage.
Horodatage Par défaut, la dernière modification des données, ou mtime.
Nom Nom affiché selon les règles de citation ; un lien symbolique peut aussi montrer le chemin qu’il référence.

Pour certains fichiers de périphériques, la colonne de taille est remplacée par les numéros majeur et mineur du périphérique. La ligne total qui précède une liste longue concerne l’allocation de stockage des entrées listées, pas leur nombre ni la taille récursive d’un arbre.

Interpréter les caractères de permissions

Dans -rw-r--r--, le premier caractère indique un fichier ordinaire. d désigne un répertoire et l un lien symbolique, c’est-à-dire un chemin renvoyant vers un autre chemin. Les neuf positions suivantes forment trois groupes : propriétaire, groupe, autres utilisateurs.

r, w et x désignent lecture, écriture et exécution ; pour un répertoire, x concerne notamment sa traversée et la recherche d’une entrée. Les caractères s, S, t et T peuvent combiner l’affichage de bits spéciaux et de l’exécution : ils ne doivent pas être lus comme de simples lettres x absentes.

Tenir compte des mécanismes d’accès supplémentaires

Un + après le mode signale des mécanismes d’accès supplémentaires, par exemple une liste de contrôle d’accès, ou ACL. GNU ls utilise un point lorsqu’un contexte de sécurité est présent sans autre mécanisme d’accès alternatif, et peut afficher ? s’il ne parvient pas à déterminer cette information.

Le mode seul ne résume donc pas tous les contrôles d’accès possibles. La documentation des informations affichées par GNU ls détaille les colonnes, unités et indicateurs.

Distinguer taille logique et espace alloué

ls -lh
ls -lah
ls -lsh

-h affiche les tailles avec des unités fondées sur les puissances de 1 024, par exemple K ou M. Il est utile avec une sortie contenant des tailles, comme -l ou -s. L’option GNU --si utilise plutôt les puissances de 1 000.

-s ajoute l’espace alloué au fichier. La taille logique et cette allocation peuvent différer, notamment avec les fichiers creux, appelés sparse files, ou selon les caractéristiques du système de fichiers. Les valeurs de -s sont exprimées dans une unité d’affichage, normalement 1 024 octets avec GNU ls ; ne les assimilez pas directement au nombre de blocs physiques du disque.

Pour choisir explicitement l’octet comme unité du format long et de l’allocation :

ls -ls --block-size=1

Les réglages d’unité et variables d’environnement peuvent influencer l’affichage. Une taille de répertoire dans la colonne longue décrit la structure du répertoire telle que le système de fichiers la rapporte, pas la somme du contenu de tous ses fichiers. Pour l’occupation d’un arbre, le guide de du et des tailles apparentes ou allouées explique le calcul adapté.

Choisir le tri et le type d’horodatage

Trier par nom, taille, date ou version

Le tri ordinaire des noms dépend de la locale. Pour un ordre déterminé par la locale C, appliquez-la au seul lancement :

LC_ALL=C ls
Commande Critère de lecture
ls -lt Format long, du mtime le plus récent au plus ancien.
ls -ltr Le même critère temporel, dans l’ordre inverse.
ls -lhS Du fichier le plus grand au plus petit, selon sa taille, avec unités lisibles.
ls -1v Une entrée par ligne avec tri de version, par exemple fichier2 avant fichier10.
ls --group-directories-first Regrouper les répertoires avant les autres entrées, puis les trier dans leur groupe.

-r inverse le critère sélectionné. Le tri par taille d’un répertoire reste un tri de sa propre taille, pas de l’occupation de son contenu. Les règles de tri de GNU ls précisent les combinaisons et les options qui désactivent le tri.

Sélectionner mtime, atime ou ctime

ls -lu
ls -lc
ls -ltu
ls -ltc

Dans ces formes longues, -u sélectionne l’heure d’accès, ou atime, et -c l’heure du dernier changement d’état, ou ctime. L’ajout de -t demande de trier selon l’horodatage choisi. Sans ce tri temporel, lire une autre date dans la colonne ne signifie pas que les noms sont triés selon cette date.

Ctime n’est pas une date de création : elle peut changer à l’écriture des données ou lors de modifications de propriétaire, de permissions ou de liens. Atime n’est pas nécessairement actualisée à chaque lecture, selon les options du montage et du programme. Le manuel Linux sur les informations d’inode décrit ces métadonnées ; un inode est la structure du système de fichiers qui porte notamment type, taille, droits et horodatages.

Afficher les dates avec un format et une zone explicites

ls -l --time-style=long-iso
ls -l --time-style=full-iso
env LC_ALL=C TZ=UTC ls -l --time-style='+%Y-%m-%d %H:%M:%S'

long-iso affiche la date et l’heure à la minute ; full-iso inclut davantage de précision et le décalage de zone. La précision affichée ne garantit pas que le système de fichiers conserve effectivement autant de chiffres significatifs.

Le dernier appel choisit la locale C et UTC pour cette présentation, sans changer l’horloge du système. La documentation du format des horodatages explique aussi l’influence de TIME_STYLE, de la locale et de TZ.

Lire les indicateurs, couleurs et noms spéciaux

Identifier des types sans confondre le suffixe et le nom

ls -F
ls --color=auto

-F peut ajouter / pour un répertoire, * pour un fichier exécutable et @ pour un lien symbolique. Ces indicateurs ne font pas partie du nom stocké. Ne les retirez pas mécaniquement pour reconstituer des noms dans un script.

--color=auto active les couleurs lorsque la sortie est un terminal ; un alias peut déjà ajouter cette option. Les couleurs dépendent notamment de LS_COLORS et de la configuration de dircolors. Pour une sortie sans codes de couleur :

ls --color=never

Conserver les limites de la présentation humaine

ls -Q
ls --quoting-style=shell-escape

-Q choisit une représentation entre guillemets de style C ; shell-escape utilise une citation adaptée au shell. Espaces, caractères de contrôle, destination terminal ou fichier et réglages de citation peuvent modifier la forme visible. Les règles GNU de présentation des noms expliquent ces cas.

Un ls -1 produit une présentation sur une colonne, pas une convention générale permettant de découper sans ambiguïté tous les noms possibles. Sur Linux, un nom peut contenir un saut de ligne : une ligne de texte n’est donc pas un séparateur fiable pour tous les traitements.

Choisir une récursion visuelle ou un traitement de fichiers

Parcourir les sous-répertoires avec -R

ls -R -- .

-R affiche successivement les contenus des sous-répertoires. Sur une grande arborescence, le résultat peut être volumineux et partiel si des accès échouent. Le choix des éléments cachés et des liens dépend toujours des options utilisées ; une récursion n’est pas une preuve que tout a pu être lu.

Pour un objectif précis, formulez directement le critère plutôt que rechercher visuellement dans un long affichage. Cet exemple GNU find recherche les fichiers ordinaires dont le nom se termine par .conf :

find . -type f -name '*.conf'

Utiliser NUL lorsque les noms deviennent des données

Pour traiter les fichiers ordinaires situés immédiatement dans le répertoire courant, voici un bloc Bash complet avec GNU find :

(
  set -o pipefail
  find . -maxdepth 1 -type f -print0 |
    while IFS= read -r -d '' fichier; do
      printf 'Fichier : %q\n' "$fichier"
    done
)

NUL sépare les noms, tandis que read -r -d '' conserve les espaces et sauts de ligne internes. printf '%q' les affiche sous une forme protégée pour Bash ; remplacez cet affichage par le traitement voulu en conservant les guillemets autour de "$fichier". pipefail évite de masquer une erreur de find derrière la réussite de la boucle.

Contrairement au choix par défaut de ls, cette recherche peut inclure les fichiers dont le nom commence par un point. Elle ne descend pas sous le premier niveau et ne choisit ici que les fichiers ordinaires : ces conditions sont intentionnelles.

Les versions récentes de GNU ls proposent aussi --zero, avec des options de sortie implicites adaptées aux noms. Vérifiez sa disponibilité ; le manuel du format général de sortie décrit ce mode. Pour combiner critères de recherche et traitement, find -print0 reste souvent plus direct.

Diagnostiquer un résultat incomplet ou inattendu

  • Accès refusé. Vérifiez le répertoire et la traversée des composants du chemin avec ls -ld chemin. Les droits de lecture et de traversée ont des rôles différents ; les ACL et autres mécanismes d’accès peuvent aussi intervenir. Déterminez l’accès nécessaire avant de changer des permissions.
  • Ordre inattendu. Contrôlez les options de tri, la locale et un éventuel alias. Pour comparer des noms en locale C, utilisez LC_ALL=C ls.
  • Trop d’arguments. Dans ls *, le shell développe le motif avant le lancement de ls. Une très grande liste peut dépasser une limite du système ; pour afficher simplement le contenu, utilisez ls sans ce motif, et pour traiter selon un critère, utilisez find.
  • Des métadonnées manquent. Des noms peuvent avoir changé pendant la lecture, un accès peut manquer ou le système de fichiers peut ne pas fournir l’information. Vérifiez le statut et les diagnostics plutôt que supposer la liste complète.

GNU ls renvoie 0 pour une réussite, 1 pour certains problèmes mineurs pendant le parcours et 2 pour des erreurs sérieuses, comme un argument inaccessible ou une option invalide. Le manuel principal de GNU ls précise ces statuts. Une sortie déjà affichée peut accompagner un échec final.