web-dev-qa-db-ja.com

シンボリックリンクターゲットが特定のパスに一致するかどうかを確認するにはどうすればよいですか?

シンボリックリンクターゲットが特定のパスに一致するかどうかを確認するbashスクリプトを作成しているので、一致しない場合、スクリプトはシンボリックリンクを削除します。 readlinkで試しました:

#!/bin/env bash

target_path=$HOME/Code/slate/.slate.js

if [ `readlink $HOME/.slate.js` == "$target_path" ]; then
    rm -rf "$HOME/.slate.js"
fi

しかし、それは機能しません:

%source test
test:5: = not found
20
Alex Guerrero

文字列を比較するときは、次のように二重引用符を使用する必要があります(もちろん、readlink $HOME/.slate.jsの出力は文字列です)。

[ "$(readlink $HOME/.slate.js)" = "$target_path" ]
23
Radu Rădeanu

万一に備えて $target_pathはリンクテキストと正確に一致していません。実際には(名前に関係なく)同等であることを確認できます。ただし、ハードリンクが望ましいので、その場合も確認することをお勧めします(以下を参照)。

より一般的な解決策は次のとおりです。

[ "$(readlink $HOME/.slate.js)" -ef "$target_path" ]

または、あなたの例のように:

target_path=$HOME/Code/slate/.slate.js

if [ "`readlink $HOME/.slate.js`" -ef "$target_path" ]; then
    rm -rf "$HOME/.slate.js"
fi

しかし、それはすべてあなたの$HOME/.slate.jsはシンボリックリンクです。それがハードリンクである場合(可能な場合は望ましい)、それはより簡単です:

 … [ "$HOME/.slate.js" -ef "$target_path" ] …

たぶん次のようなものです(それがシンボリックリンクであるかどうかを確認し、そうである場合は、リンクがターゲットと一致することを確認します。そうでない場合は、ファイルが同じかどうかを確認します-ハードリンクまたは実際には同じファイル):

 … [ \( -L "$HOME/.slate.js" -a "`readlink $HOME/.slate.js`" -ef "$target_path" \) \
     -o \( "$HOME/.slate.js" -ef "$target_path" \) ] …

また、ファイルが実際に同じファイル(ハードリンクではない)であるかどうかを確認する必要があります。そうでない場合は、唯一のコピーを削除します。

7
wrlee