我正在创建一个bash脚本来检查symlink目标是否与特定路径匹配,因此,如果不匹配,脚本将删除symlink。我试过用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
发布于 2013-11-08 21:44:56
在比较字符串时,应该使用双引号,如下所示(是的,readlink $HOME/.slate.js
的输出是一个字符串):
[ "$(readlink $HOME/.slate.js)" = "$target_path" ]
发布于 2015-04-10 02:46:21
如果$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" \) ] …
您还应该检查该文件是否确实是相同的文件(而不是硬链接),否则将删除唯一的副本。
https://stackoverflow.com/questions/19860345
复制相似问题