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

62

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

Si je tape dir , il affiche les fichiers et les dossiers dans le répertoire, et si je tape ls , il fait de même, sauf avec la mise en évidence du contenu. Les deux commandes acceptent les options (c.-à-d. Que ls -a et dir -a retournent tous les fichiers et dossiers et les fichiers cachés.

Quelqu'un sait-il quelle est la différence et pourquoi dir et ls sont utilisés?

    
posée BretD 13.02.2012 - 19:15
la source

5 réponses

57

dir et ls font partie de coreutils et dir est presque identique à ls , juste avec différentes options par défaut.

  

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

info dir dit:

  

dir est équivalent à ls -C -b ; c'est à dire que par défaut les fichiers sont listés   dans les colonnes, triées verticalement, et les caractères spéciaux sont représentés   par des séquences d'échappement de backslash.

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

  

vdir est équivalent à ls -l -b ; c'est-à-dire que, par défaut, les fichiers sont   énumérés dans le format long et les caractères spéciaux sont représentés par   séquences d'échappement de backslash.

Probablement que dir existe pour des raisons de compatibilité ascendante ou pour des raisons historiques.

    
réponse donnée Rinzwind 13.02.2012 - 19:33
la source
37

La relation entre ls et dir

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

Il existe deux idées fausses sur dir :

  • Beaucoup de personnes pensent que dir est un alias de ls , mais ce n'est pas le cas. Aucune des deux commandes 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 personnes pensent que dir existe pour des raisons historiques obscures ou pour assurer la compatibilité avec un système d'exploitation standard ou un autre. Ce n’est pas le cas non plus. ls se comporte comme il le fait pour la compatibilité. dir , qui ne doit pas nécessairement être compatible car il ne s'agit pas d'une commande Unix standard, se comporte d'une manière alternative jugée utile par les développeurs. propre droit et peut-être même préférable.

OK, mais comment diffèrent ls et dir ?

ls et dir répertorient tous les deux 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, 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 un pipe ), ls lists 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 les indicateurs --format= et les indicateurs -1 , -C , -m et -x , qui abrégent notamment% co_de. % d'options Voir 10.1.4 Formatage de sortie général dans GNU Manuel de référence 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 , --format= imprime ls au lieu de chaque caractère de contrôle (comme ? ). Lorsque sa sortie standard n'est pas un terminal, ls -q imprime les caractères de contrôle tels quels (comme ls ).

    Que sa sortie standard soit ou non un terminal, lorsque ls --show-control-chars rencontre un caractère de contrôle ou tout autre caractère qui serait interprété spécialement s'il est entré dans un shell, il imprime des séquences de barre oblique inverse pour les caractères. Cela inclut même des caractères relativement communs comme les espaces. Par exemple, dir affichera une entrée appelée dir comme Documents backups . C'est comme Documents\ backups .

    Pour les deux ls -b et ls , ces valeurs par défaut peuvent être remplacées par les indicateurs listés dans 10.1.7 Formatage des noms de fichier dans le manuel de référence GNU coreutils . Cela inclut dir , -b , -q et quelques autres.

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

Pourquoi --quoting-style= ?

La raison d’être d’un utilitaire dir distinct est donnée dans 4.5 Normes pour les interfaces en général des normes de codage GNU . Je recommande de lire toute cette section pour comprendre le raisonnement des développeurs, mais voici les points forts applicables à dir / ls :

  

S'il vous plaît ne pas faire le comportement d'un utilitaire dépend du nom utilisé pour   invoquez-le ....

     

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

     

De même, veuillez ne pas faire le comportement d'un programme de ligne de commande   dépendent du type de périphérique de sortie ....

     

La compatibilité nécessite que certains programmes dépendent du type de   dispositif de sortie. Ce serait désastreux si dir ou ls ne le faisait pas en   la façon dont tous les utilisateurs s'attendent.Dans certains de ces cas, nous complétons le   programme avec une version alternative préférée qui ne dépend pas de la   type de périphérique de sortie. Par exemple, nous fournissons un programme sh un peu comme    dir sauf que son format de sortie par défaut est toujours multi-colonnes   format.

Le projet GNU considère qu’il n’est pas souhaitable, d’un point de vue technique, qu’un utilitaire produise des sorties différentes selon le type d’appareil sur lequel il écrit (au moins dans la configuration par défaut de l’utilitaire). Pour certains utilitaires, y compris ls , la sortie dépendante du périphérique est nécessaire pour la compatibilité et fonctionne comme prévu. Certains utilisateurs préfèrent également 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 ls distinct a été créé pour y parvenir. Ainsi, dir n'est pas l'utilitaire qui se comporte étrangement pour des raisons de compatibilité historique - dir est .

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

ls.c est-il vraiment utile?

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

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

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

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

La plupart des utilisateurs d'Ubuntu ont un alias appelé dir qui exécute ls . Lorsque ls --color=auto existe à la fois en tant qu'alias et 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 - c'est la commande externe ls que l'alias ls appelle avec ls . Voir 6.6 les alias dans la Manuel de référence Bash pour plus d'informations sur le fonctionnement des alias.

Lorsqu'elle est transmise à --color=auto , ls ou dir (et à d'autres commandes, telles que vdir ), grep utilise la couleur lorsque sa sortie est un terminal, mais pas autrement.

Par défaut dans Ubuntu, les comptes utilisateur sont créés avec ceci dans --color=auto :

# 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 ~/.bashrc ( ls ) est décommenté, tandis que ceux pour alias ls='ls --color=auto' et dir sont mis en commentaire avec vdir , ils ne prennent donc aucun effet. En d'autres termes, alors que # n'est pas un alias, dir est (mais pas à ls ) .

Comment est-ce que dir produit aussi des sorties en couleur?

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

Si vous souhaitez modifier le shell actuel, vous pouvez exécuter la définition d'alias en tant que commande, ou vous pouvez générer dir en exécutant .bashrc .

Cela va sans doute à l'encontre du point principal de . ~/.bashrc - à savoir qu'il devrait produire le même type de sortie quel que soit le périphérique de sortie. Cependant:

  • Si vous trouvez utile de créer cet alias dir , vous devriez certainement 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 \dir , command dir produira toujours une sortie indépendante du périphérique. Cela signifie que l'aliasing dir à dir ne rompt pas vraiment dir --color=auto .
réponse donnée Eliah Kagan 29.04.2015 - 18:15
la source
4
  

Je serais enclin à penser que dir est là juste pour les retours en arrière   compatibilité .

     

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 de backslash.

        

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

Source: Renan a answer to Quelle est la différence entre "Dir" et "ls" ?

    
réponse donnée Zlatan 14.09.2013 - 18:40
la source
2

Réponse courte: aucune, dir est un alias de ls , comme l'a dit @Rinzwind, ls a --color par défaut

    
réponse donnée Francisco Valdez 13.02.2012 - 19:26
la source
2

En cas de doute, comparez type ls vs 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+"[email protected]"}
}
$ echo command ls $LS_OPTIONS ${1+"[email protected]"}
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.

    
réponse donnée user2394284 22.12.2016 - 22:45
la source

Lire d'autres questions sur les étiquettes