リンクのターゲットへのフルパスを取得する方法


13

/var/opt/foo作成したシンボリックリンクがある場合ln -fs /path/to/target/dir foo。リンクの取得のみを確認するスクリプトでどうすればよい/path/to/target/dirですか?

スクリプトで達成したいのは、実行するrm -rf /path/to/target/dir前のことですln -fs /path/to/another/dir foo

回答:


30
link=/var/opt/foo

target=$(readlink "$link")

$target ファイルシステムに格納されたとおりに、リンクのターゲットになります。

ただし、シンボリックリンクは相対的なものになる可能性があるため、通常の使用にはこれが適しています。

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

これはreadlink、BSDおよび他のシステムには存在しない可能性があるGNU Coreutilsから使用することに注意してください。

編集: readlink -fリンクターゲットが存在する限り、BSDで動作します。realpathBSD専用の別のツールであり、同様に機能します。


1
BSDには、readlink()4.2BSDの時代からシステムコールがありました。現在のBSDsのreadlink ユーティリティはFreeBSD 4.10でリリースされました。statコマンドのハードリンクとして(再)実装されました(MacOS Xマニュアルページ FreeBSD 9マニュアルページ)。-mオプションがないことに注意してください。
JdeBP 2011

@JdeBP:ありがとう。これにはがあり-freadlink -f同様に機能します(リンクターゲットが存在する場合)。BSDでは、realpathのもう1つの代替手段のようreadlink -mです。
user1686 2011

0

1つの方法は(私はより良いバージョンを望んでいます)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"

4
readlinkあなたの友だちです。
JdeBP 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.