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

74

J'ai essayé de trouver la différence entre utiliser les commandes diret lsdans le terminal. Je sais que ls est la méthode UNIX traditionnelle permettant d'afficher les fichiers d'un répertoire. Il dirs'agit de l'équivalent d'invite de commande Windows, mais les deux commandes fonctionnent dans un terminal.

Si je tape dircela affiche les fichiers et les dossiers du répertoire, et si je tape, lsil en va de même, sauf avec la mise en surbrillance du contenu. Les deux commandes acceptent les options (c.-à ls -a- d. Et les dir -adeux renvoient tous les fichiers, dossiers et fichiers cachés.

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

BretD
la source
7
dir --color;)
Rinzwind
3
je voulais juste dire que je suis surpris de l'ampleur de la réponse à cette question. Je suppose que je n'étais pas le seul à me
poser des
3
Les commandes des temps anciens traînent toujours les nerds plus âgés hors des bois;)
Rinzwind

Réponses:

70

diret lsfont partie de coreutilset direst presque le même que ls, juste avec différentes options par défaut.

Les utilitaires GNU Core 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 vdir! info vdirdit:

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 inversée.

Il direxiste très probablement une compatibilité ascendante ou pour des raisons historiques.

Rinzwind
la source
Je pensais que c'était probablement juste un alias de l'autre. J'ai supposé que le raisonnement était de faire en sorte que les utilisateurs de Windows se sentent plus à la maison lol Merci pour la réponse complète!
BretD
4
tapez alias dirpour voir ce que c'est réellement. tapez aliaspour voir tous les alias.
user606723
2
@ user606723, "alias dir" n'apparaît pas dans 11.10 (du moins pas pour moi). Je pense que "alias" affiche uniquement les paramètres d'alias d'utilisateur local, et non l'ensemble du système.
James
tapez type dirpour voir ce que c'est (un alias, une commande, une fonction bash ...)
ychaouche 23/03/17
49

La relation entre lsetdir

lset dirsont des programmes distincts qui se comportent de la même manière. Comme expliqué et référencé ci-dessous, le but de direst de fournir une commande du type lsdont la sortie ne varie pas selon qu’elle va ou non à un terminal . Pour y parvenir utilement, il dirfaut 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 les points suivants dir:

  • Beaucoup de gens croient que dirc'est un pseudonyme ls, mais ce n'est pas le cas. Aucune commande n'est un alias de l'autre, et par défaut dans Ubuntu, ce dirn'est pas du tout un alias. lset dirsont fournis par des exécutables distincts non identiques.
  • Beaucoup de gens croient qu’il direxiste 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. lsse comporte comme il le fait pour la compatibilité. dir, qui n’a pas besoin d’être compatible car ce n’est pas une commande Unix standard, se comporte de manière différente, ce que les développeurs considèrent comme précieux et peut-être même préférable.

OK, mais exactement comment lset dirdiffèrent?

Les deux lset dirlistent le contenu des répertoires. Deux différences spécifiques dans leurs comportements par défaut les distinguent.

  1. Lorsque sa sortie standard est un terminal, lsré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 un canal ), lsliste les noms de fichiers un par ligne (comme ls -1).

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

    Pour les deux lset dir, ces valeurs par défaut peuvent être remplacés par le --format=drapeau et les -1, -C, -met des -xdrapeaux, qui Abréger particulières --format=options. 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 des caractères de contrôle , est lsimprimé à la ?place de chaque caractère de contrôle (comme ls -q). Lorsque sa sortie standard n’est pas un terminal, lsaffiche les caractères de contrôle tels ls --show-control-charsquels.

    Que sa sortie standard soit ou non un terminal, lorsqu'elle dirrencontre 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, dirlistera une entrée appelée Documents backupscomme Documents\ backups. C'est comme ls -b.

    Pour les deux lset 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 . Cela inclut -b, -q, --quoting-style=et quelques autres.

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

Pourquoi dir?

La justification d'un dirutilitaire distinct est donnée dans 4.5 Normes d'interface généralement des normes de codage GNU . Je recommande de lire toute cette section pour comprendre le raisonnement des développeurs, mais voici les points saillants applicables à ls/ dir:

S'il vous plaît, ne faites pas dépendre le comportement d'un utilitaire du nom utilisé pour l'invoquer ....

Au lieu de cela, utilisez une option d'exécution ou un commutateur de compilation ou les deux pour sélectionner l'un des comportements alternatifs ....

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 de le faire lsou de shne pas le faire de la manière attendue par 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 dirprogramme très similaire lsà celui mis à part 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 cet utilitaire). Pour certains utilitaires, notamment ls, une sortie dépend de l'appareil est nécessaire pour la compatibilité et fonctionne donc comme prévu. Certains utilisateurs préfèrent également spécifiquement ce comportement dépendant du périphérique.

Bien qu'il lsne soit pas raisonnable d'écrire pour se comporter de manière indépendante, un dirutilitaire distinct a été créé à cette fin. Ainsi, dirl’utilité qui se comporte étrangement pour des raisons de compatibilité historique ne l’ lsest pas .

Pour voir comment ls, diret le connexe vdirutilitaire sont mis en œuvre dans le code source coreutils sans duplication de code inutile, voir ls-dir.c, ls-ls.c, ls-vdir.c, ls.het ls.c.

Est-ce dirvraiment utile?

Si vous avez déjà souhaité lsproduire une sortie multi-colonne, même lorsque vous l'avez transmise à less( ls | less) ou redirigée vers un fichier ( ls > out.txt), vous pouvez utiliser dirou ls -C.

Si vous avez déjà souhaité, vous pouvez directement copier un nom de fichier indiqué par lset l’utiliser dans le cadre d’une commande sans vous soucier de la citer , vous pouvez utiliser dirou ls -b.

direst équivalent à ls -Cb, donc dans ce sens vous n'avez pas besoin dir. Mais dirfournit 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é lsqui fonctionne ls --color=auto. Lorsqu'il lsexiste à la fois comme alias et comme commande externe, l'alias a la priorité dans les commandes simples et interactives.

Les définitions d'alias ne sont pas développées de manière récursive - c'est la lscommande externe avec laquelle l' lsalias appelle --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, dirou vdir(et à d’autres commandes, par exemple grep), --color=autoutilise color lorsque son résultat est un terminal, mais pas autrement.

Par défaut dans Ubuntu, les comptes d'utilisateurs 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 le lspseudonyme ( alias ls='ls --color=auto') n'est pas commenté , tandis que ceux pour diret vdirsont commentés #afin qu'ils ne prennent aucun effet. Autrement dit, tout dirn'est pas un alias, lsest (mais pas dir) .

Comment puis-je aussi dirproduire des sorties colorées?

Pour activer la sortie en couleur avec dir, éditez simplement .bashrcdans votre répertoire personnel et #alias dir='dir --color=auto'supprimez la mise en commentaire de la ligne en supprimant l’entrée #. Dans les obus commencés après le changement, ce dirsera un alias.

Si vous souhaitez modifier le shell en cours, vous pouvez exécuter la définition d'alias en tant que commande ou vous pouvez créer une source .bashrcen exécutant . ~/.bashrc.

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

  • Si vous trouvez utile de faire cet diralias, 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 par exécution \dirou command dir, dirproduira toujours une sortie indépendante du périphérique. C'est-à-dire que l'aliasing dirto dir --color=autone casse pas vraiment dir.
Eliah Kagan
la source
Réponse de qualité, mais pourrait utiliser une ToC ou une TL; DR; :)
Kevin
5

Je serais enclin à penser que ce dirn'est là que 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.

Soit dit en passant, lsne coloriser pas la sortie par défaut: c'est parce que la plupart des alias de distros lsà ls --color=autoen /etc/profile.d. Pour un test, tapez unalias lspuis essayez ls: il sera incolore.

Source: Renan de réponse à Quelle est la différence entre « dir » et « ls » ?

Zlatan
la source
Bien que la compatibilité avec les versions antérieures nedir soit pas fournie - et est enls réalité - cette réponse (et la réponse qu’elle cite) énonce correctement la différence technique entre les deux commandes et explique la différence de coloration généralement observée. Alors +1.
Eliah Kagan
3

En cas de doute, comparez type lsvs 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 pour que ls, dans mon cas, --color=ttyce soit la plus visible, votre système peut différer.

utilisateur2394284
la source
2
Cela ne semble pas du tout être une configuration d’utilisateur Ubuntu par défaut. Je ne pense pas que les systèmes Ubuntu que j'ai utilisés aient eu lscomme alias pour une fonction appelée _ls- pas même comme une entrée commentée .bashrc. Cela semble être la valeur par défaut pour (au moins certaines versions de) openSuSE, cependant, à en juger par cette conversation , ce fichier (lié à partir de là) et ma mémoire (certes peut-être fausse) de la dernière fois que j'ai utilisé openSUSE.
Eliah Kagan
2
@EliahKagan: Vous l'avez deviné, j'utilise OpenSuse! Donc, comme je l'ai dit, le résultat sera différent, mais la méthode devrait être correcte.
user2394284
2

Réponse courte: Aucun, direst le même code source que ls, lsbinaire ont --colorpar défaut. (1 ligne de code diff)

Francisco Valdez
la source
7
dirn'est pas un alias de ls. Ce sont des binaires séparés dans ce /usr/binqui se comportent différemment, comme décrit dans la réponse de Rinzwind . Vous pouvez y parvenir avec des alias, mais ce n’est pas comme cela que l’on obtient. Des fichiers séparés et binaires apparaissent sur tous les systèmes utilisant GNU Coreutils . Si vous avez besoin d'une preuve, courez . dirlscmp /bin/ls /bin/dir
Eliah Kagan
2
il y a quelque temps, c'était un alias et vous pouviez le voir listé dans la liste des alias simplement en tapant alias, un nouveau fichier binaire est maintenant compilé pour dir. Vous pouvez télécharger son code avec: git clone git://git.sv.gnu.org/coreutils. Une seule ligne de code est modifié dans ls-dir.c et est la suivante: int ls_mode = LS_MULTI_COL;. Techniquement, ce n'est pas un alias, mais c'est pratiquement LS mais avec différentes options par défaut (1 ligne de code).
Francisco Valdez
1
Oui, direst lsmais avec différentes options par défaut . diret lsont toujours été des fichiers binaires distincts dans les distributions qui utilisent GNU Coreutils. Certaines distributions peuvent, ou peuvent avoir, également défini un alias appelé dir(définir des alias qui portent le même nom qu'une commande existante est assez commun). Mais ce sont des exécutables séparés. Faire la distinction entre un alias de shell (qui n’est pas du tout un fichier) et un exécutable séparé avec un code source similaire n’est pas une distinction pédante. Il est faux et trompeur de dire qu’il dirs’agit d’un alias lsdans Ubuntu.
Eliah Kagan
Oui, je suis d'accord avec vous, mais dans ce cas, le code source n'est pas similaire, c'est le même code source. Si nous disons qu'un alias n'est qu'un élément de la liste, aliasil ne s'agit bien sûr pas d'un alias.
Francisco Valdez
3
Ce n'est pas le même code source. Comme vous l'avez dit, "une ligne de source est modifiée". Et si c’était la même source, ce ne serait toujours pas un alias. Dans un système semblable à Unix, il y a beaucoup d'éléments semblables aux alias, mais qui seraient très déroutants pour les novices (et exaspérants pour les utilisateurs expérimentés) d'appeler des alias. Les liens symboliques, les liens durs, les fichiers identiques, les fichiers similaires, les scripts d'encapsulation, les exécutables masqués du shell et les fichiers synchronisés (par exemple avec UbuntuOne) ressemblent beaucoup aux alias, mais ce ne sont pas des alias.
Eliah Kagan