删除源自特定目录的符号链接

删除源自特定目录的符号链接

我有一个“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

您可以修改脚本并使用grepreadlinkrealpath将文件提取到所需的子目录中,例如:

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

相关内容