So erhalten Sie den vollständigen Pfad zum Ziel des Links

13

Wenn ich einen symbolischen Link mit /var/opt/fooerstellt habe ln -fs /path/to/target/dir foo. Wie kann ich in einem Skript, das nur den Link sieht, bekommen /path/to/target/dir?

Was ich im Skript erreichen möchte, ist, rm -rf /path/to/target/dirbevor ich es tue ln -fs /path/to/another/dir foo.

Nifle
quelle

Antworten:

30
link=/var/opt/foo

target=$(readlink "$link")

$target ist jetzt das Ziel des Links, genau so, wie es im Dateisystem gespeichert wurde.

Symlinks können jedoch relativ sein, daher ist dies für den normalen Gebrauch besser:

target=$(readlink -f "$link")

Beachten Sie, dass dies readlinkvon GNU Coreutils verwendet wird, die in BSD und anderen Systemen möglicherweise nicht vorhanden sind.

Bearbeiten: Funktioniert readlink -f mit BSDs, solange das Link-Ziel vorhanden ist. realpathist ein weiteres BSD-Tool, das auf ähnliche Weise funktioniert.

user1686
quelle
1
Die BSDs haben readlink()seit den Tagen von 4.2BSD einen Systemaufruf. Das aktuelle BSD- readlink Dienstprogramm wurde mit FreeBSD 4.10 veröffentlicht. Es wurde als fester Link für den statBefehl (neu) implementiert ( MacOS X-Handbuchseite FreeBSD 9-Handbuchseite ). Beachten Sie, dass es keine -mOption gibt.
JdeBP
@ JdeBP: Danke. Es hat -fund readlink -ffunktioniert genauso gut (vorausgesetzt, das Link-Ziel existiert). In BSD realpathscheint eine andere Alternative zu sein readlink -m.
user1686
0

Ein Weg ist (ich hoffe auf eine bessere Version)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
quelle
4
readlinkist dein Freund.
JdeBP