如何删除具有特殊目标的所有符号链接?

Mar*_*iel 59 symlink wildcards rm

使用命令:

ls -la *
Run Code Online (Sandbox Code Playgroud)

我可以列出我所有的符号链接。

如何删除链接到特殊文件夹的所有符号链接?

例如:

在我的目录中,usr/local/bin我有以下条目:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara
Run Code Online (Sandbox Code Playgroud)

现在我想删除所有带有路径的链接 /usr/local/texlive/

0xC*_*22L 87

请务必阅读替代答案。虽然在这一点上投票没有那么高,但它更重要。

您可以使用它来删除所有符号链接:

find -type l -delete
Run Code Online (Sandbox Code Playgroud)

与现代find版本。

在较旧的查找版本上,它可能必须是:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;
Run Code Online (Sandbox Code Playgroud)

要限制到某个链接目标,假设所有路径都不包含任何换行符:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done
Run Code Online (Sandbox Code Playgroud)

或者格式很好

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done
Run Code Online (Sandbox Code Playgroud)

所述if当然可以还包括一个更复杂的条件,例如与匹配的图案grep


根据您的情况量身定制:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done
Run Code Online (Sandbox Code Playgroud)

或者格式很好:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
Run Code Online (Sandbox Code Playgroud)


Chr*_*röm 41

随着现代find支持-lname

find /usr/local/bin -lname '/usr/local/texlive/*' -delete
Run Code Online (Sandbox Code Playgroud)

应该这样做。

  • 甚至不一定是现代的。GNU `find` 使用 `-lname` 的时间比我维护它的时间长(从 2003 年左右开始)。 (2认同)

Mik*_*kel 5

find解决方案是伟大的。

以防万一您的 find 不支持-lname,这是另一种仅使用 shell 和readlink.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
Run Code Online (Sandbox Code Playgroud)