Comment utiliser le format long (-l) tout en suivant les liens symboliques des répertoires?

27

J'ai remarqué que ls -lcela ne change pas seulement la mise en forme de la sortie, mais aussi la façon dont les liens symboliques des répertoires sont traités:

> ls /rmn
biweekly.sh  daily.sh  logs ...

> ls -l /rmn
lrwxrwxrwx 1 root root 18 Feb 11  2011 /rmn -> /root/maintenance/

J'aimerais obtenir une liste détaillée de ce qui est contenu /rmn, pas des informations sur le /rmnlien symbolique.

Une solution de contournement à laquelle je peux penser est de créer une fonction shell qui fait quelque chose comme ceci:

cd /rmn
ls -l
cd -

Mais cela semble trop hacky, d'autant plus que cela gâche la prochaine utilisation de cd -. Y a-t-il une meilleure façon?

(Je suis sur CentOS 2.6.9)

RomanSt
la source
J'ai également remarqué cela et je suis allé sur Google pour voir si quelqu'un l'avait également remarqué. C'est comme ça que je suis venu ici. :)
Yevgeniy Afanasyev

Réponses:

27

Voyez si votre ls a les options:

 -H, --dereference-command-line
     follow symbolic links listed on the command line 
 --dereference-command-line-symlink-to-dir
     follow each command line symbolic link that points to a directory

Si ceux-ci ne vous aident pas, vous pouvez faire fonctionner votre macro sans gâcher cd -en faisant:

(cd /rmn ; ls -l)

qui s'exécute en sous-coque.

pjc50
la source
Il l'a fait -H, et cela a fait l'affaire. Merci!
RomanSt
4
Je souhaite vraiment que cela --dereference-command-line-symlink-to-dirait une forme courte.
wchargin
14

Je ne comprends pas très bien pourquoi la réflexion sur ce problème simple doit être si complexe - mais peut-être que je viens de poser la question dans le mauvais sens. Quoi qu'il en soit: lorsque j'avais besoin d'une fonctionnalité similaire, j'utilisais:

ls -lL

Cela a fait l'affaire dans mon cas. Depuis la lspage de manuel:

-L, --dereference
     when showing file information for a symbolic link, 
     show  information  for  the file the link references
     rather than for the link itself

Par exemple, je me suis fait un /media/stickraccourci pour accéder aux données de ma clé USB. ls -l /media/stickaffichera le lien réel, tandis que ls -lL /media/stickmontrera le contenu sur la clé USB.

Après des recherches plus approfondies sur la différence entre le fonctionnement interne de -Het -L, j'ai finalement trouvé un excellent article à ce sujet sur le blog Shallow Thoughts (même avec quelques astuces de script shell pour votre plaisir!)

Cela souligne les différences subtiles entre les deux options (bien mieux que le manuel d'origine!) Comme suit:

  • -H - ne déréférencer que les liens explicitement mentionnés sur la ligne de commande
  • -L- déréférencer les liens même s'ils ne sont pas mentionnés sur la ligne de commande

(Lorsque ces deux éléments sont utilisés avec des tâches quotidiennes simples , il ne devrait y avoir aucune différence dans la sortie en général.)

En outre: si vous préférez vous souvenir de la forme longue ( --option), il est probablement moins lourd à mémoriser --dereferenceque le monstre excessivement long de --dereference-command-line-symlink-to-dir.

erreur de syntaxe
la source
5
ls -l /rmn/

le ferait ou

ls -l /rmn/.

Cependant, le comportement ne doit pas être différent avec et sans -l. Avez-vous un alias ls?

Stéphane Chazelas
la source
3
lsles drapeaux sont fous. -lfait -Hpar défaut à off, comme le fait -F. Voir coreutils - Quels fichiers sont répertoriés .
Mikel
@Mikel, il semble que vous ayez parfaitement raison. Et oui, c'est fou. (aussi, je n'ai pas d'alias pour ls, j'ai essayé de l'échapper mais les résultats sont les mêmes)
RomanSt
En effet, il est même spécifié par POSIX. J'étais celui avec un ls='ls -F'alias en fait.
Stéphane Chazelas