Symlinks im aktuellen Verzeichnis auflisten?

8

In dieser Frage geht es darum, Verzeichnisse in einem aktuellen Verzeichnis zu finden. Die Lösung ist im Grunde:

ls -d */

Das ist großartig, aber wie kann ich einfach Symlinks auflisten? Muss ich so etwas benutzen?

find . -xtype l -d 1
(intended to find symlinks max depth 1 - doesn't work)

Oder gibt es einen einfacheren Weg? Kann ich dafür verwendet werden?

cwd
quelle
Auf meinem Ubuntu-System zeigt ein kurzer Blick auf die man findShows, -ddie ein Synonym für -depth(aus Kompatibilitätsgründen mit FreeBSD, NetBSD, MacOS X und OpenBSD) sind, d. H. es ist nicht dasselbe wie -maxdepth. . . -depth
Verarbeiten Sie

Antworten:

9

In zsh ( Nin Klammern hinzufügen , um Symlinks einzuschließen, deren Name mit a beginnt .):

echo *(@)

Bei den meisten findImplementierungen:

find -maxdepth 1 -type l

POSIX-konform:

find . -type d \! -name . -prune -o -type l -print

Oder mit einer Shell-Schleife:

for x in * .*; do
  if [ -h "$x" ]; then echo "$x"; done
done
Gilles 'SO - hör auf böse zu sein'
quelle
1
Für die -pruneOption müssen Sie verwenden find topdir ! -name topdir -prune; Andernfalls wird auch das Startverzeichnis ignoriert.
Arcege
6

Dies ist nicht auf einem Mac, aber

find . -maxdepth 1 -type l

funktioniert bei mir.

frogstarr78
quelle
3

Sie sollten verwenden -typeund nicht -xtype:

   -xtype c
          The same as -type unless the file is a symbolic link.  For  sym‐
          bolic  links:  if the -H or -P option was specified, true if the
          file is a link to a file of type c; if the -L  option  has  been
          given,  true  if  c is `l'.  In other words, for symbolic links,
          -xtype checks the type of the file that -type does not check.

Die Standardeinstellung ist -P, daher versucht die Option -xtype, die resultierende Datei zu ermitteln, nicht den Symlink selbst. Eigentlich bekomme ich einige positive Ergebnisse, was wie ein Fehler erscheint. Das -P -xtype lsollte true (auf einem Symlink) zurückgeben, wenn das Ergebnis selbst ein symbolischer Link ist.

Kann auch verwenden: Hier ls -FA | sed -ne 's/@//p'werden nur die Symlinks angezeigt.

Arcege
quelle
schöne ls Lösung
frogstarr78
2
sed -ne 's/@//p'(und auch sed -ne 's/@$//p') ist kein sicherer Test, als die erste Version wird ein falsch positive geben , wenn @überall in der auftritt ls Ausgabe, und die zweiter wird eine falsche postive zurück , wenn ein Dateiname tatsächlich endet in@
Peter.O
1

So finden Sie nur die Dateien heraus, die Symlinks im aktuellen Verzeichnis sind:

find . -type l -printf '%p -> %l\n'

Dadurch werden alle Symlink-Dateien rekursiv aufgelistet. Außerdem werden die tatsächlichen Dateien angezeigt, auf die es verweist.

Immergrün1
quelle