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.


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.