我有一个“install.sh”来安装我的个人脚本:
find /home/Steven -name '*.sh' -exec ln -s -t /usr/local/bin {} +
我想制作一个“uninstall.sh”来删除“install.sh”创建的符号链接。我写了这个:
for z in /usr/local/bin/*
do
if [ -h "$z" ]
then rm "$z"
fi
done
但它会删除所有符号链接,而不仅仅是目标位于“/home/Steven”下的符号链接。
答案1
如果你有 GNU 或 BSD find
,这应该可以做到:
find -lname '/home/Steven/*' -delete
答案2
您可以修改脚本并使用grep
或readlink
或realpath
将文件提取到所需的子目录中,例如:
for z in /usr/local/bin/*
do
if [ -h "${z}" ] && readlink -f "${z}" | grep -q '^/home/Steven'
then rm "${z}"
fi
done
该readlink -f
命令返回符号链接指向的文件的完整路径。grep -q '^/home/Steven'
如果路径以子字符串“/home/Steven”开头,则该命令返回 true,否则返回 false。
需要注意的是:与符号链接相关的一些歧义可能会影响此处的结果。该readlink -f
命令将以递归方式解析链接,因此如果目录中的文件/home/Steven
本身是该目录之外的符号链接点,则上述命令将失败。如果这不是所需的行为,那么您可能需要改用该realpath
命令。
答案3
为了涵盖链接可能是相对的情况并检查它们的规范路径是否在/home/Steven
, 内zsh
:
rm /usr/local/bin/*(@e{'[[ $REPLY:A = /home/Steven/* ]]'})
在哪里:
@
与符号链接匹配的 glob 限定符:e{code}
根据代码评估匹配的 glob 限定符(其中$REPLY
包含要检查的文件的路径)$REPLY:A
扩展为 的绝对路径$REPLY
。