如何检查符号链接目标是否与特定路径匹配?

时间:2013-11-08 13:34:22

标签: bash shell if-statement symlink

我正在创建一个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

2 个答案:

答案 0 :(得分:23)

比较字符串时,您应该使用双引号(是的,readlink $HOME/.slate.js的输出是字符串):

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

答案 1 :(得分:7)

如果$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" \) ] …

您还应该检查文件是否实际上是同一个文件(而不是硬链接),否则您将删除该文件并且仅复制。