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


43

使用命令:

ls -la *

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

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

例如:

在我的目录中,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

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


1
您是说删除链接到目标文件夹的所有符号链接吗?还是将所有找到的符号链接移到特定文件夹?
乔治M

@uther:我的意思是删除链接。
Marco Daniel

Answers:


63

请确保阅读替代答案。这一点甚至更重要,尽管在这一点上还没有得到很高的评价。

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

find -type l -delete

与现代find版本。

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

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

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

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

或格式正确

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

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


根据您的情况量身定制:

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

或格式正确:

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

该命令是否删除所有符号链接?请在上方查看我的编辑
马可·丹尼尔

@Marco:是的,前三行会。编辑更多:)
0xC0000022L 2012年

我还将-printfind命令末尾添加a 以获得一些视觉反馈。
runlevel0 2013年

30

拥有现代化的find支持-lname

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

应该这样做。


1
这是一个很棒且简单的解决方案。我测试了一下,它就像一个魅力。谢谢
Marco Daniel

大概应该是find /usr/local/bin
James Youngman

1
甚至不是现代的。GNU find拥有-lname的时间比我维护的时间长(自2003年左右以来)。
James Youngman

@JamesYoungman:谢谢!现代,find我真的是指GNU find。;)我曾经使用过usr/local/bin,因为这就是OP所使用的。
ChristofferHammarström,2012年

5

find解决方案是伟大的。

以防万一您的搜索结果不支持-lname,这是另一种仅使用shell和的方式readlink

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

1

zsh

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:P完全解析到无符号链接的路径,因此假设/usr/local/texlive符号链接本身是免费的,它将删除所有在符号链接解析后有效的文件,这些文件/usr/local/textlive将包含指向,指向或指向的链接/usr/local/texlive/foo../texlive/bar或指向/usr/./local/texlive/whatever/some/other/symlink指向指向的链接/usr/local/texlive,等等。 。


0

转到路径并设置路径配置

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

由于这些像路径usr/local/bingrep搜索的路径,grep -E是要走的路。否则,将没有匹配的结果。另外hls这里没有任何作用!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)。有关更多信息,请参阅man lsman grep
ss_iwe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.