web-dev-qa-db-fra.com

Différence entre les commandes de terminal 'dir' et 'ls'?

J'ai essayé de trouver la différence entre les commandes diret lsdans le terminal. Je sais que ls est la méthode UNIX traditionnelle d'affichage des fichiers dans un répertoire, et que dircorrespond à l'invite de commande Windows, mais les deux commandes fonctionnent dans un terminal.

Si je tape dirname__, il affiche les fichiers et les dossiers du répertoire. Si je tape lsname__, il en va de même, sauf que le contenu est mis en surbrillance. Les deux commandes acceptent les options (c'est-à-dire ls -a et dir -a renvoient tous les fichiers, dossiers et fichiers cachés.

Alors, est-ce que quelqu'un sait quelle est la différence et pourquoi diret lssont utilisés?

74
BretD

diret lsfont partie de coreutilsNAME _ et direst presque identique à lsname__, mais avec des options par défaut différentes.

Les GNU Core Utilities sont les utilitaires de base de fichiers, de shell et de manipulation de texte du système d'exploitation GNU. Ce sont les utilitaires de base qui devraient exister sur tous les systèmes d'exploitation.

info dir dit:

direst équivalent à ls -C -b; c'est-à-dire que, par défaut, les fichiers sont répertoriés dans des colonnes, triés verticalement et que les caractères spéciaux sont représentés par des séquences d'échappement avec une barre oblique inversée.

Oh, et il y a aussi vdirname__! info vdir dit:

vdirest équivalent à ls -l -b; c'est-à-dire que, par défaut, les fichiers sont listés au format long et les caractères spéciaux sont représentés par des séquences d'échappement avec une barre oblique inverse.

Il est fort probable que direxiste pour des raisons de compatibilité ascendante ou pour des raisons historiques.

69
Rinzwind

La relation entre ls et dir

ls et dir sont des programmes distincts qui se comportent de la même manière. Comme expliqué et référencé ci-dessous, dir a pour but de fournir une commande telle que ls dont la sortie ne varie pas selon qu’elle va ou non à un terminal . Pour y parvenir utilement, dir doit formater sa sortie de manière raisonnable et utile à la fois pour l'affichage dans un terminal et pour l'écriture dans un fichier ou un canal.

Il existe deux idées fausses sur dir:

  • Beaucoup de gens croient que dir est un alias de ls, mais ce n'est pas le cas. Aucune commande n'est un alias de l'autre, et par défaut dans Ubuntu, dir n'est pas du tout un alias. ls et dir sont fournis par des exécutables distincts et non identiques.
  • Beaucoup de gens pensent que dir existe pour des raisons historiques obscures ou pour assurer la compatibilité avec un système d'exploitation standard ou autre. Ce n'est pas le cas non plus. ls se comporte comme il le veut pour la compatibilité. dir, qui n'a pas besoin d'être compatible car ce n'est pas une commande Unix standard, se comporte d'une autre manière que les développeurs jugent utile de son propre droit et peut-être même préférable.

OK, mais en quoi ls et dir diffèrent-ils exactement?

ls et dir répertorient tous deux le contenu des répertoires. Deux différences spécifiques dans leurs comportements par défaut les distinguent.

  1. Lorsque sortie standard est un terminal, ls répertorie les noms de fichiers dans des colonnes triées verticalement (comme ls -C). Lorsque sa sortie standard n'est pas un terminal (par exemple, un fichier ou pipe ), ls répertorie les noms de fichiers un par ligne (comme ls -1).

    Que sa sortie standard soit ou non un terminal, dir répertorie les noms de fichiers dans des colonnes triées verticalement (comme ls -C).

    Pour ls et dir, ces valeurs par défaut peuvent être remplacées par l'indicateur --format= et par les indicateurs -1, -C, -m et -x, qui abrégent des options --format= particulières. Voir 10.1.4 Formatage général des sorties dans le Manuel de référence de GNU coreutils pour plus de détails.

  2. Lorsque sa sortie standard est un terminal et qu'un nom de fichier à répertorier contient caractères de contrôle , ls imprime ? à la place de chaque caractère de contrôle (comme ls -q). Lorsque sa sortie standard n'est pas un terminal, ls imprime les caractères de contrôle tels quels (comme ls --show-control-chars).

    Que sa sortie standard soit ou non un terminal, lorsque dir rencontre un caractère de contrôle ou tout autre caractère qui serait interprété spécialement si elle était entrée dans un shell, elle imprime des séquences de barres obliques inverses pour les caractères. Cela inclut même des caractères relativement communs tels que des espaces. Par exemple, dir répertoriera une entrée appelée Documents backups sous la forme Documents\ backups. Cela ressemble à ls -b.

    Pour ls et dir, ces valeurs par défaut peuvent être remplacées par les drapeaux listés dans 10.1.7 Formater les noms de fichiers dans le manuel de référence de GNU coreutils . Ceci inclut -b, -q, --quoting-style= et quelques autres.

Sources : invocation de ls et invocation de répertoire , dans le manuel de référence de GNU coreutils .

Pourquoi avoir dir?

La justification d'un utilitaire séparé dir est donnée dans 4.5 Normes relatives aux interfaces en général sur Normes de codage GN . Je vous recommande de lire toute cette section pour comprendre le raisonnement des développeurs, mais voici les points saillants qui s'appliquent à ls/dir:

Merci de ne pas faire dépendre le comportement d’un utilitaire du nom utilisé pour l’appeler ....

À la place, utilisez une option d'exécution ou un commutateur de compilation, ou les deux, pour sélectionner l'un des comportements suivants ....

De même, veuillez ne pas associer le comportement d’un programme en ligne de commande au type de périphérique de sortie ....

La compatibilité nécessite que certains programmes dépendent du type de périphérique de sortie. Il serait désastreux que ls ou sh ne le fasse pas comme le souhaitent tous les utilisateurs. Dans certains cas, nous complétons le programme avec une version alternative préférée, qui ne dépend pas du type de périphérique de sortie. Par exemple, nous fournissons un programme dir très similaire à ls, à la différence que son format de sortie par défaut est toujours un format multi-colonnes.

Le projet GNU considère qu'il n'est pas souhaitable, d'un point de vue technique, qu'un utilitaire produise une sortie différente en fonction du type de périphérique sur lequel il écrit (du moins dans la configuration par défaut de l'utilitaire). Pour certains utilitaires, y compris ls, une sortie dépendante du périphérique est nécessaire pour la compatibilité et fonctionne donc comme le souhaitent les utilisateurs. Certains utilisateurs préfèrent également spécifiquement ce comportement dépendant du périphérique.

Bien que ls ne puisse raisonnablement pas être écrit pour se comporter de manière indépendante, un utilitaire séparé dir a été créé à cet effet. Ainsi, dir n'est pas l'utilitaire qui se comporte étrangement pour des raisons de compatibilité historique - ls est .

Pour savoir comment ls, dir et l'utilitaire connexe vdir sont implémentés dans le code source de coreutils sans duplication inutile du code, voir ls-dir.c , ls-ls.c , ls-vdir.c =, ls.h , et ls.c .

Est-ce que dir est vraiment utile?

Si vous avez déjà souhaité que ls produise une sortie sur plusieurs colonnes même si vous l'avez redirigé vers less (ls | less) ou si vous l'avez redirigé vers un fichier (ls > out.txt), vous pouvez utiliser dir ou ls -C.

Si vous avez déjà souhaité pouvoir copier directement un nom de fichier affiché par ls et l'utiliser comme partie intégrante d'une commande sans vous soucier de citer , vous pouvez utiliser dir ou ls -b.

dir est équivalent à ls -Cb, vous n'avez donc pas besoin de dir. Mais dir fournit une combinaison d'options qui, dans la pratique, sont souvent utiles (bien que peu connues).

Pourquoi ai-je une sortie colorisée de ls (même ls -Cb) mais pas dir?!

La plupart des utilisateurs Ubuntu ont un alias appelé ls qui exécute ls --color=auto. Lorsque ls existe à la fois comme alias et comme commande externe, l'alias est prioritaire dans les commandes simples et interactives.

Les définitions d'alias ne sont pas développées de manière récursive: il s'agit de la commande externe ls que l'alias ls appelle avec --color=auto. Voir 6.6 Alias dans le Manuel de référence Bash pour plus d'informations sur le fonctionnement des alias.

Lorsque passé à ls, dir ou vdir (et à certaines autres commandes, telles que grep), --color=auto utilise la couleur lorsque sa sortie est un terminal, mais pas autrement.

Par défaut dans Ubuntu, les comptes d’utilisateur sont créés avec ceci dans ~/.bashrc:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

Vous remarquerez que l'alias ls (alias ls='ls --color=auto') n'est pas commenté, alors que ceux de dir et vdir sont commentés avec #, ils n'ont donc aucun effet. C'est-à-dire que alors que dir n'est pas un alias, ls est (mais pas à dir) .

Comment puis-je faire pour que dir produise une sortie en couleurs aussi?

Pour activer la sortie en couleur avec dir, éditez simplement .bashrc dans votre répertoire personnel et décommentez la ligne #alias dir='dir --color=auto' en supprimant le # initial. Dans les shells commencés après le changement, dir sera un alias.

Si vous souhaitez que la modification soit apportée au shell actuel, vous pouvez exécuter la définition d'alias en tant que commande ou vous pouvez générer .bashrc en exécutant . ~/.bashrc.

Cela va sans doute à l’encontre du point principal de dir-- selon lequel il devrait produire le même type de sortie, quel que soit le périphérique de sortie. Toutefois:

  • Si vous trouvez utile de faire cet alias dir, vous devriez le faire.
  • Lorsqu'elle est appelée en tant que commande externe, par exemple dans des scripts ou si vous remplacez l'alias en exécutant \dir ou command dir, dir produira toujours une sortie indépendante du périphérique. Cela revient à dire que l'aliasing dir avec dir --color=auto ne rompt pas vraiment dir.
48
Eliah Kagan

Je serais enclin à penser que dir est juste pour la compatibilité ascendante .

De GNU Coreutils :

dir est équivalent à ls -C -b; c'est-à-dire que, par défaut, les fichiers sont répertoriés dans des colonnes, triés verticalement et que les caractères spéciaux sont représentés par des séquences d'échappement avec une barre oblique inversée.

Par ailleurs, ls ne colorise pas la sortie par défaut: c'est parce que la plupart des distributions alias ls à ls --color=auto dans /etc/profile.d. Pour un test, tapez unalias ls puis essayez ls: il sera incolore.

Source: Renan 's réponse à Quelle est la différence entre “dir” et “ls” ?

5
Zlatan

En cas de doute, comparez type ls et type dir (voir aussi Différence entre ls et la ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

La différence se résume à différentes options à ls, dans mon cas --color=tty serait le plus visible, votre système peut différer.

3
user2394284

Réponse courte: None, dir est le même code source que ls, ls binary a --color par défaut. (1 ligne de code diff)

2
Francisco Valdez