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

32743
bguiz

Die Frage bezieht sich auf das Shell-Scripting in bash.

Wie kann mit einem Skript überprüft werden, 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 offensichtlich ist dies nicht die beste Lösung.

10
Sie werden als "symbolische Links" bezeichnet (im Gegensatz zu "harten Links"). Dennis Williamson vor 14 Jahren 1
Righto, ich wusste, dass ich den Begriff wahrscheinlich falsch verstanden habe, danke für das Heads-Up bguiz vor 14 Jahren 0
Soft Link ist auch gut, aber mit einem Leerzeichen. :-) (http://en.wikipedia.org/wiki/Symbolic_link) Arjan vor 14 Jahren 0

2 Antworten auf die Frage

14
Polsy

Siehe 'CONDITIONAL EXPRESSIONS' in man bash- in diesem Fall möchten Sie -h:

for file in * do if [ -h "$file" ]; then echo "$file" fi done 
http://www.faqs.org/docs/bashman/bashref_68.html - Für bedingte Ausdrücke ist das Lesen besser als auf der man-Seite. Manos Dilaverakis vor 14 Jahren 2
Danke @Polsy und @Manos! "test -h" ist was ich wollte! bguiz vor 14 Jahren 0
14
Arjan

Sie benötigen möglicherweise kein Skript. So zeigen Sie symbolische Links nur im aktuellen Ordner an, ohne in einen untergeordneten Ordner zu rekursieren:

finden . -maxdepth 1-typ l -print

Um weitere Informationen zu erhalten, verwenden Sie eine der folgenden Optionen:

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

Um festzustellen, ob eine Datei ein symbolischer Link ist, kann man verwenden readlink, der nichts ausgibt, wenn es sich nicht um einen symbolischen Link handelt. Das folgende Beispiel ist nicht sehr nützlich, zeigt jedoch, wie readlinknormale Dateien und Ordner ignoriert werden. Verwenden Sie eines von:

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-type l -exec ls -ld {} \; echte 0m0.372s Benutzer 0m0.087s sys 0m0.163s  Zeit find / usr / bin -maxdepth 1-type 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
Ich mochte die Antwort von Polsy besser, immer noch +1 für Sie, da ich sie vielleicht eines Tages außerhalb eines Shell-Skripts machen muss. bguiz vor 14 Jahren 0
Sie brauchen nicht unbedingt Xargs. Sie könnten nur find verwenden. -maxdepth 1 -exec readlink {} \; stib vor 12 Jahren 1
Stimmt, @stib, aber `xargs` ist auf meinem Mac * wesentlich schneller. siehe meine Bearbeitung Aber ich habe heute etwas Neues gelernt: Es gibt auch "+" anstelle von "\;" (obwohl einige behaupten, dass [diese Probleme hatte / hatte) (http://www.sunmanagers.org/pipermail/summaries/2005-March/006255) .html) mit "grep".) Arjan vor 12 Jahren 0
interessant. danke für das teilen. stib vor 12 Jahren 0