Wie finde ich alle Softlinks (symbolische Links) im aktuellen Verzeichnis?

10

Die Frage bezieht sich auf Shell-Scripting in bash.

Wie kann man mit einem Skript überprüfen, welche Dateien im aktuellen Verzeichnis Softlinks sind?

Falls ich den falschen Begriff verwendet habe, wenn ich Softlinks sage , beziehe ich mich auf Dateien, die mit erstellt wurden ln -s.

Das einzige, woran ich denken konnte, ist, ls -laals Ausdruck zu bewerten und seine Ergebnisse zu analysieren, aber dies ist offensichtlich nicht die beste Lösung.

bguiz
quelle
1
Sie werden als "symbolische Links" bezeichnet (im Gegensatz zu "harten Links").
Bis auf weiteres angehalten.
Richtig, ich wusste, dass ich den Begriff wahrscheinlich falsch verstanden habe, danke für das Heads-up
bguiz
Soft Link ist auch in Ordnung, aber mit einem Leerzeichen. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Antworten:

14

Siehe 'BEDINGTE AUSDRÜCKE' in man bash- in diesem Fall möchten Sie -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
Polsy
quelle
2
faqs.org/docs/bashman/bashref_68.html - Für bedingte Ausdrücke ist das Lesen besser als für die Manpage.
Manos Dilaverakis
Danke @Polsy und @Manos! test -hist was ich wollte!
Bguiz
14

Möglicherweise benötigen Sie kein Skript. So zeigen Sie symbolische Links nur im aktuellen Ordner an, ohne in einen untergeordneten Ordner zurückzukehren:

finden . -maxdepth 1 -typ l -print

Oder verwenden Sie eine der folgenden Informationen, um weitere Informationen zu erhalten:

finden . -maxdepth 1 -type l -exec ls -ld {} +
finden . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Um festzustellen, ob eine Datei eine symbolische Verknüpfung ist, kann eine verwendet werden readlink, die nichts ausgibt, wenn es sich nicht um eine symbolische Verknüpfung handelt. Das folgende Beispiel ist nicht sehr nützlich, zeigt jedoch, wie readlinknormale Dateien und Ordner ignoriert werden. Verwenden Sie eine der folgenden Optionen:

finden . -maxdepth 1 -exec readlink {} +
finden . -maxdepth 1 -print0 | xargs -0 readlink

Beachten Sie, dass die oben genannten -exec ... +und xargs ...sind viel schneller als -exec ... \;. Mögen:

Zeit find / usr / bin -maxdepth 1 -typ l -exec ls -ld {} \;
echte 0m0.372s
Benutzer 0m0.087s
sys 0m0.163s

Zeit find / usr / bin -maxdepth 1 -typ l -exec ls -ld {} +
echte 0m0.013s
Benutzer 0m0.004s
sys 0m0.008s

Zeit find / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
echte 0m0.012s
Benutzer 0m0.004s
sys 0m0.009s
Arjan
quelle
Ich mochte Polsys Antwort besser, immer noch +1 für Sie, da ich sie möglicherweise eines Tages außerhalb eines Shell-Skripts ausführen muss.
Bguiz
1
Sie brauchen nicht unbedingt Xargs. Sie könnten einfach finden. -maxdepth 1 -exec readlink {} \;
Stib
Es stimmt, @stib, aber xargsist viel schneller auf meinem Mac; siehe meine Bearbeitung. Aber ich lernte etwas Neues: es gibt auch +statt \;(Obwohl einige behaupten , dass dies hat / hatte Probleme mit grep.)
Arjan