如何删除除符号链接指向的目录之外的所有目录

如何删除除符号链接指向的目录之外的所有目录

我有以下目录结构。

drwxr-xr-x 5 ec2-user ec2-user 4096 May 22 07:03 TEEST  
drwxr-xr-x 5 ec2-user ec2-user 4096 May 24 05:33 BEE-TES  
drwxr-xr-x 5 ec2-user ec2-user 4096 May 24 10:53 ONE  
drwxr-xr-x 5 ec2-user ec2-user 4096 May 25 09:50 TWO  
lrwxrwxrwx 1 ec2-user ec2-user   28 May 25 09:50 previous -> TWO  
drwxr-xr-x 5 ec2-user ec2-user 4096 Jun  1 11:00 TEMP  
lrwxrwxrwx 1 ec2-user ec2-user   28 Jun  1 11:00 current -> TEMP

如何删除除符号链接指向的目录之外的所有目录?

答案1

{ find . -type l -exec readlink {} \; ; find . -type d -exec basename {} \; ; } | sort | uniq -u | tail -n +2 | xargs rmdir

慢动作:

  • find . -type l -exec readlink {} \;找到链接并列出相应的目录
  • find . -type d -exec basename {} \;查找并列出目录
  • 括号中的命令的输出列出所有目录一次,除了那些出现两次的链接目标
  • sort | uniq -u | tail -n +2仅保留唯一名称(即未链接到的目录)并删除.
  • xargs rmdir删除目录。替换为rm -r以删除其内容。

答案2

{ find /some/symlinks/* -type l -exec sh -c "readlink {} | xargs basename" \; ; find /some/folders/* -maxdepth 1 -type d -prune -exec basename {} \;  ; } | sort | uniq -u | awk '{print "/some/folders/"$0}' | xargs rm -r

这可以处理不同目录中的多种类型的符号链接。

find /some/symlinks/* -type l -exec sh -c "readlink {} | xargs basename" \;

查找符号链接并获取目录的基本名称。

find //some/folders/* -maxdepth 1 -type d -prune -exec basename {} \;

从文件链接处查找所有基本名称。不要进入子目录并进行修剪,这样您只能获得文件夹名称

sort | uniq -u 

排序并找出没有链接的。

awk '{print "/some/folders/"$0}'

将目录放回原处。

xargs rm -r

删除该文件夹。

相关内容