ls -l --group-directory-first (wirkt auch auf Symlinks)

9

lsOption --group-directories-firstbewirkt, dass Verzeichnisse oben aufgelistet werden, wodurch die Ausgabe von lsschön und sauber wird:

ls -l --group-directories-first

Es wirkt jedoch nicht auf symlinksdie tatsächlich symlinkszu Verzeichnissen. Es besteht die Möglichkeit zu verwenden

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

Dadurch werden beide Arten von Verzeichnissen oben aufgelistet, es wird jedoch nicht zwischen dem richtigen Verzeichnis und dem verknüpften Verzeichnis unterschieden, was wiederum verwirrend ist.

Können lssymlinkierte Verzeichnisse oben angezeigt werden, ohne dass sie sich von regulären Verzeichnissen unterscheiden?

EDIT: Ich benutze bash.

Martin Vegter
quelle
Dies ist ein eigenwilliges Verhalten von ls. Gemäß dem stat()Systemaufruf ist eine symbolische Verknüpfung zu einem Verzeichnis immer noch ein Verzeichnis ( S_ISDIR(st_mode)gibt true zurück). Offensichtlich werden lsdie Symlinks reduziert, bevor dies überprüft wird.
Goldlöckchen
2
@goldilocks, nein, lstut lstat()(und readlinkfür Symlinks), es sei denn, Sie verwenden die -LOption (in diesem Fall verwendet es stat())
Stéphane Chazelas
@StephaneChazelas: Hmm, lebe und lerne. Ich hatte gedacht, dass S_ISLNK(st_mode)auch true via zurückgegeben wird stat(), aber das tut es nicht - es tut es nur via lstat(). Außerdem gibt ISLNK über stat nicht true zurück, selbst wenn der Link ein Link zu einem Link ist. Das bedeutet, dass dies ISLNKmöglicherweise nie über stat zurückgegeben wird, obwohl dies nicht spezifiziert ist ...
Goldlöckchen
@goldilocks statgibt Ihnen die Eigenschaften der Datei am Ende der Symlinks an. Wenn dies nicht vorhanden ist oder nicht zugänglich ist, statgibt das ENOENT zurück. Was also von zurückgegeben statwird, ist niemals ein Symlink. stat()Ich werde dir niemals etwas über Symlinks erzählen, genauso wie openich niemals den Symlink öffnen chmod()werde oder die Berechtigungen eines Symlinks nicht ändern werde ... usw.
Stéphane Chazelas

Antworten:

5

Nein, aber wenn Sie verwenden zsh, können Sie Folgendes tun:

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

Sie können auch eine Sortierreihenfolge wie folgt definieren:

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

und benutze es wie:

ls -ldU -- *(o+dir1st)

Auf diese Weise können Sie es für andere Befehle als lsoder lsmit anderen Optionen oder für verschiedene Muster wie:

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

oder:

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

Wenn Sie verwenden müssen bash, wäre das Äquivalent wie folgt:

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 -- "$@"
)

bashEs gibt keine Globbing-Qualifikationsmerkmale oder eine Möglichkeit, die Sortierreihenfolge von Globs zu beeinflussen oder Nullglob pro Glob zu aktivieren, oder es gibt keinen lokalen Kontext für Optionen (außer dem Starten einer Subshell, daher die AFAIK ()anstelle von {}oben) .

Stéphane Chazelas
quelle
1
Gibt es einen ähnlichen Trick für bash?
Martin Vegter