ls -l --group-directories-first (agisci anche su symlink)


9

lsL'opzione --group-directories-firstfa sì che le directory siano elencate in alto, il che rende l'output di lsbello e pulito:

ls -l --group-directories-first

Tuttavia, non agisce symlinks, che in realtà sono le symlinksdirectory. C'è la possibilità di usare

ls -l -L --group-directories-first

che elencherà entrambi i tipi di directory in cima, ma non farà distinzione tra directory corretta e directory symlinked, il che è di nuovo fonte di confusione.

È possibile lsvisualizzare le directory con collegamenti simbolici in cima, pur mantenendole distinte dalle directory normali?

EDIT: sto usando bash.


Questo è un comportamento idiosincratico da parte di ls. Secondo la stat()chiamata di sistema, un collegamento simbolico a una directory è ancora una directory ( S_ISDIR(st_mode)restituirà true). Evidenzia evidentemente lsi collegamenti simbolici prima di verificarlo.
Riccioli d'oro

2
@goldilocks, no, lo lsfa lstat()(e readlinkper i collegamenti simbolici) a meno che tu non usi l' -Lopzione (nel qual caso utilizza stat())
Stéphane Chazelas

@StephaneChazelas: Hmm, vivi e impara. Avevo pensato che S_ISLNK(st_mode)anche restituito vero via stat(), ma non lo fa - lo fa solo via lstat(). Inoltre, ISLNK non restituisce true tramite stat anche se il collegamento è un collegamento a un collegamento. Significa che ISLNKpotrebbe non tornare mai vero tramite stat, anche se è un po 'non specificato ...
goldilocks

@goldilocks, statti dà le proprietà del file alla fine dei collegamenti simbolici. Se ciò non esiste o non è accessibile, statrestituisce un ENOENT, quindi ciò che viene restituito statnon sarà mai un collegamento simbolico. stat()non ti dirò mai nulla dei symlink, proprio come opennon aprirò mai il symlink, o chmod()non cambierà i permessi di un symlink ... ecc.
Stéphane Chazelas,

Risposte:


5

No, ma se si utilizza zsh, è possibile:

mll() {
  (($#)) || set -- *(N-/) *(N^-/)
  (($#)) && ls -ldU -- $@
}

È inoltre possibile definire un ordinamento globbing come:

dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}

e usalo come:

ls -ldU -- *(o+dir1st)

In questo modo, puoi usarlo per altri comandi rispetto lso con lsopzioni diverse o per motivi diversi come:

ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs

o:

ls -ldU -- ^*[[:lower:]]*(o+dir1st) # to list the all-uppercase files and dirs

Se devi usare bash, l'equivalente sarebbe come:

mll() (
  if (($# == 0)); then
    dirs=() others=()
    shopt -s nullglob
    for f in *; do
      if [[ -d $f ]]; then
        dirs+=("$f")
      else
        others+=("$f")
      fi
    done
    set -- "${dirs[@]}" "${others[@]}"
  fi
  (($#)) && exec ls -ldU -- "$@"
)

bashnon ha qualificazioni globbing o alcun modo per influenzare l'ordinamento dei globs, o alcun modo per trasformare nullglob su base per-glob, o avere un contesto locale per le opzioni (diverso dall'avvio di una subshell, quindi al ()posto di {}sopra) AFAIK .


1
C'è qualche trucco simile per bash?
Martin Vegter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.