Как использовать длинный формат (-l), следуя по ссылкам на каталоги?


27

Я заметил, что ls -lэто меняет не только форматирование вывода, но и способ обработки символьных ссылок каталога:

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

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

Я хотел бы получить подробный список того, что там /rmn, а не информацию о /rmnсимволической ссылке.

Один из обходных путей, который я могу придумать, - это создать функцию оболочки, которая делает что-то вроде этого:

cd /rmn
ls -l
cd -

Но это кажется слишком хакерским, тем более, что это портит следующее использование cd -. Есть ли способ лучше?

(Я на CentOS 2.6.9)


Я также заметил это и пошел гуглить, чтобы увидеть, заметил ли кто-то тоже. Вот как я пришел сюда. :)
Евгений Афанасьев

Ответы:


27

Посмотрите, есть ли у вашего ls варианты:

 -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

Если это не помогает, вы можете заставить свой макрос работать без ошибок cd -, выполнив:

(cd /rmn ; ls -l)

который работает в подоболочке.


Это имеет -H, и это сделало свое дело. Спасибо!
RomanSt

4
Я действительно хотел бы, чтобы --dereference-command-line-symlink-to-dirбыла короткая форма.
wchargin

14

Я не совсем понимаю, почему мышление об этой простой проблеме должно быть настолько сложным - но, возможно, я просто неправильно понял вопрос. В любом случае: когда мне понадобился подобный функционал, я использовал:

ls -lL

Это добилось цели в моем случае. Со lsстраницы руководства :

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

Например, я сделал /media/stickярлык для доступа к данным на USB-накопителе. ls -l /media/stickпокажет актуальную ссылку, а ls -lL /media/stickпокажет содержимое на флешке.

После некоторого более глубокого исследования различий между внутренними принципами -Hи -L, я наконец-то наткнулся на отличную статью по этому вопросу в блоге Shallow Мысли (даже с некоторыми изящными приемами сценариев оболочки для вашего удовольствия!)

Это указывает на тонкие различия между двумя вариантами (намного лучше, чем в оригинальном руководстве!) Следующим образом:

  • -H - разыменовывать только те ссылки, которые явно указаны в командной строке
  • -L- ссылки разыменования, даже если они не упомянуты в командной строке

(Когда эти два используются в простых повседневных задачах, не должно быть никакой разницы в результатах в целом.)

Кроме того: Если вы предпочитаете запоминать длинную форму ( --option), то, скорее всего, запоминать будет менее громоздко, --dereferenceчем чрезмерно длинного монстра --dereference-command-line-symlink-to-dir.


5
ls -l /rmn/

сделал бы это или

ls -l /rmn/.

Однако поведение не должно быть разным с и без -l. У вас есть псевдоним для ls?


3
lsфлаги сумасшедшие. -lпо -Hумолчанию выключен, как и -F. Смотрите coreutils - Какие файлы перечислены .
Микель

@ Микель, похоже, ты абсолютно прав в этом. И да, это безумие. (также у меня нет псевдонима для ls, я пытался его избежать, но результат тот же)
RomanSt

На самом деле это даже указано в POSIX. На ls='ls -F'самом деле я был единственным с псевдонимом.
Стефан Шазелас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.