Wie verwende ich ls, um Verzeichnissymlinks mit anderen Verzeichnissen zu gruppieren?

7

ls --group-directories-firstZeigt alle Verzeichnisse vor Dateien an. Wenn jedoch ein Symlink zu einem Verzeichnis vorhanden ist, wird dieser unter den Dateien angezeigt. Gibt es eine Möglichkeit, Verzeichnissymlinks mit anderen regulären Verzeichnissen zu gruppieren?

Martin Heralecký
quelle
2
Macht -Lwas du willst
Arkadiusz Drabczyk
@ArkadiuszDrabczyk Nun, nicht genau. Auf diese Weise erkenne ich nicht, ob es sich um einen Symlink handelt oder nicht. Trotzdem die bisher beste Lösung - Sie sollten eine Antwort darauf geben.
Martin Heralecký
Hier gibt es eine ähnliche Frage: unix.stackexchange.com/questions/111637/… . Eine Lösung in der akzeptierten Antwort funktioniert gut für mich in bash.
Arkadiusz Drabczyk

Antworten:

5

Erwägen Sie die Verwendung -L. Zum Beispiel:

$ ls -l
total 4
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
lrwxrwxrwx 1 ja users    1 Dec 20 13:23 sl -> b
$ ls --group-directories-first -l
total 4
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A
lrwxrwxrwx 1 ja users    1 Dec 20 13:23 sl -> b
$ ls --group-directories-first -lL
total 8
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 b
drwxr-xr-x 2 ja users 4096 Dec 20 13:23 sl
-rw-r--r-- 1 ja users    0 Dec 20 13:23 A
Arkadiusz Drabczyk
quelle
5

Ich denke nicht, dass dies ohne möglich ist -L(was Ihnen Informationen über das Ziel des Symlinks anstelle des Symlinks gibt).

Sie können immer twols-Aufrufe ausführen , einen für die Verzeichnisse, einen für die Nicht-Verzeichnisse. Mit zsh:

lldirfirst() {
  local -a dir nondir
  local ret=0
  dir=(*(N-/)) nondir=(*(N^-/))
  (($#dir == 0)) || ls -ld -- $dir || ret=$?
  (($#nondir == 0)) || ls -ld -- $nondir || ret=$?
  return $ret
}

ls -lDies gilt nur für das aktuelle Verzeichnis. Es muss angepasst werden, um andere Dateien / Verzeichnisse aufzulisten.

Beachten Sie auch, dass die Spaltenausrichtung möglicherweise beschädigt wird:

$ lldirfirst
drwxr-xr-x 2 chazelas chazelas 4096 Dec 20 13:20 c
lrwxrwxrwx 1 chazelas chazelas    1 Dec 20 13:20 d -> c
-rw-r--r-- 1 chazelas chazelas 0 Dec 20 13:20 a
-rw-r--r-- 1 chazelas chazelas 0 Dec 20 13:20 b

Eine andere Möglichkeit wäre, -qFdie Zeilen zu verwenden und zu sortieren, die /zuerst enden (setzt GNU voraus, lsda nicht jede lsImplementierung /Symlinks zu Verzeichnissen enthält und eine sortImplementierung, die -swie GNU unterstützt sort, aber Ihre --group-directories-firstist ohnehin schon GNU-spezifisch):

lsdirfirst() {
  ls -qF "$@" |
    awk '{if(/^total [0-9]+$/ || /\/$/) n=1; else n=2; print n, $0}' |
    sort -sk1,1 | cut -d' ' -f2-
}

Beispiel:

$ lsdirfirst -l
total 4
drwxr-xr-x 2 chazelas chazelas 4096 Dec 20 13:20 c/
lrwxrwxrwx 1 chazelas chazelas    1 Dec 20 13:20 d -> c/
-rw-r--r-- 1 chazelas chazelas    0 Dec 20 13:20 a
-rw-r--r-- 1 chazelas chazelas    0 Dec 20 13:20 b

Beachten Sie, dass zshSie mit seinem Vervollständigungssystem anweisen können, die Verzeichnisse zuerst aufzulisten mit:

zstyle ':completion:*' list-dirs-first true

Außerdem werden Symlinks zu Verzeichnissen in der Verzeichniskategorie eingefügt:

$ ls Tab
Verzeichnis vervollständigen
c / d @
Dateien vervollständigen
ab

(mit Farben und denen, die ... Beschreibungen vervollständigen, wenn mit mehr zstyles aktiviert )

Sie können diesen Abschlussstil für einen Befehl pro Basis aktivieren, indem Sie diesen zstyleBefehl in Folgendes ändern :

zstyle ':completion:*:*:(ls|echo):*:*' list-dirs-first true

Zum Beispiel, um es nur für die Befehle lsund zu aktivieren echo.

Hier ist ein Beispiel für die ~/.zshrcKonfiguration, um diese Ausgabe in der obigen Farbe zu erhalten.

eval "$(dircolors -b)"
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate _prefix
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' menu select=2
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-dirs-first true
autoload -Uz compinit
compinit -i

Siehe auch die compinstallFunktion für eine menübasierte Schnittstelle zum Konfigurieren der zsh-Vervollständigung.

Stéphane Chazelas
quelle
IIUC, mllhier vorgestellt unix.stackexchange.com/a/111639/72304 würde tun, was OP will bash, oder?
Arkadiusz Drabczyk
Wenn jemand die lsdirfirst()Funktion verwendet und die für Menschen lesbare -hOption verwenden möchte , ändern Sie den zu lesenden regulären Ausdruck /^total [0-9\.]+\w+?$/. Ohne dies wird die "Summe" zwischen den Verzeichnissen und Dateien angezeigt, wo sie nicht angezeigt werden soll.
Danemacmillan