Jak ls używać długiego formatu (-l), wciąż śledząc dowiązania symboliczne katalogu?

27

Zauważyłem, że ls -lnie tylko zmienia to formatowanie danych wyjściowych, ale także sposób obsługi dowiązań symbolicznych katalogu:

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

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

Chciałbym uzyskać szczegółową listę tego, co jest w środku /rmn, a nie informacje o /rmndowiązaniu symbolicznym.

Jednym z obejść, które mogę wymyślić, jest utworzenie funkcji powłoki, która robi coś takiego:

cd /rmn
ls -l
cd -

Ale to wydaje się zbyt hackerskie, zwłaszcza że przeszkadza w następnym użyciu cd -. Czy jest lepszy sposób?

(Jestem na CentOS 2.6.9)

RomanSt
źródło
Zauważyłem to również i poszukałem google, aby sprawdzić, czy ktoś też to zauważył. Tak tu przybyłem. :)
Jewgienij Afanasiew

Odpowiedzi:

27

Sprawdź, czy twój ls ma opcje:

 -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

Jeśli to nie pomoże, możesz sprawić, by twoje makro działało bez bałaganu, cd -wykonując:

(cd /rmn ; ls -l)

który działa w podpowłoce.

pjc50
źródło
Ma -H, i to załatwiło sprawę. Dziękuję Ci!
RomanSt
4
Naprawdę chciałbym --dereference-command-line-symlink-to-dirmieć krótką formę.
wchargin
14

Nie do końca rozumiem, dlaczego myślenie o tym prostym problemie musi być tak skomplikowane - ale może po prostu dostałem pytanie w niewłaściwy sposób. W każdym razie: kiedy potrzebowałem podobnej funkcjonalności, użyłem:

ls -lL

To załatwiło sprawę w moim przypadku. Ze strony podręcznika 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

Na przykład utworzyłem /media/stickskrót do dostępu do danych na pamięci USB. ls -l /media/stickpokaże rzeczywisty związek, podczas gdy ls -lL /media/stickpokaże zawartość na dysku USB.

Po głębszych badaniach dotyczących różnicy między wewnętrznym działaniem -Ha -L, wreszcie znalazłem doskonały artykuł na ten temat na blogu Shallow Thoughts (nawet z ciekawymi sztuczkami skryptowymi dla twojej przyjemności!)

Wskazuje to na subtelne różnice między dwiema opcjami (o wiele lepsze niż w oryginalnej instrukcji!) W następujący sposób:

  • -H - wyłącza tylko te linki, które zostały wyraźnie wymienione w wierszu poleceń
  • -L- linki Dereferencjuje nawet jeśli są one nie wymienione w wierszu poleceń

(Gdy te dwa są używane do prostych codziennych zadań, ogólnie nie powinno być różnicy w wydajności).

Poza tym: Jeśli wolisz pamiętać długą formę ( --option), najprawdopodobniej jest mniej kłopotliwe w zapamiętywaniu --dereferenceniż zbyt długi potwór z --dereference-command-line-symlink-to-dir.

błąd składni
źródło
5
ls -l /rmn/

zrobiłbym to lub

ls -l /rmn/.

Jednak zachowanie nie powinno być inne zi bez niego -l. Masz alias ls?

Stéphane Chazelas
źródło
3
lsflagi są szalone. -lsprawia, że -Hdomyślnie wyłączone, jak robi -F. Zobacz coreutils - które pliki są wymienione .
Mikel
@Mikel wygląda na to, że masz całkowitą rację. I tak, to szalone. (też nie mam aliasu dla ls, próbowałem go uciec, ale wyniki są takie same)
RomanSt
Rzeczywiście jest nawet określony przez POSIX. Właściwie to ja miałem ls='ls -F'alias.
Stéphane Chazelas,