如何删除除最后2个目录之外的所有目录,符号链接指向这些目录

时间:2019-04-19 09:43:48

标签: linux bash shell unix scripting

我具有以下目录结构。

~/test_dir$ls -lrt
total 8
drwxr-xr-x  5 kk  Users   160B Apr 17 23:53 app1/
drwxr-xr-x  5 kk  Users   160B Apr 17 23:53 app2/
drwxr-xr-x  5 kk  Users   160B Apr 17 23:53 app3/
drwxr-xr-x  5 kk  Users   160B Apr 17 23:53 app4/
drwxr-xr-x  5 kk  Users   160B Apr 17 23:53 app5/

~/test_dir$cd app1

~/test_dir/app1$ls -rlt
total 0
drwxr-xr-x  2 kk  10677    64B Apr 19 14:16 release1/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:16 release2/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:16 release3/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:16 release4/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:17 release5/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:17 relase23/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:17 release8.9/
lrwxr-xr-x  1 kk  10677     8B Apr 19 14:18 Current@ -> release4

~/test_dirls -t1 | tail -n +3 | grep -v Current
relase23/
release5/
release4/
release3/
release2/
release1/

如何仅保留或保留最近修改的最后两个目录,包括符号链接及其指向的各自目录?

我尝试了以下

~/test_dirls -t1 | tail -n +3 | grep -v Current 
relase23/
release5/
release4/
release3/
release2/
release1/

~/test_dir/app1$ls -t1 | tail -n +3 | grep -v Current | xargs rm -r
~/test_dir/app1$ls -rlt
total 0
drwxr-xr-x  2 kk  10677    64B Apr 19 14:17 release8.9/
lrwxr-xr-x  1 kk  10677     8B Apr 19 14:18 Current@ -> release4

但是那个甚至删除指向symlink的目录,只保留损坏的symlink。


#!/bin/bash
array=("app1" "app2" "app3" "app4" "app5")

for ((i=0;i<${#array[@]};i++))
do
app=${array[$i]}
echo "the app dir name is: $app"
cd ~/test_dir/$app
count=$(ls -t1 | tail -n +4 | grep -v Current | wc -l)
echo "number of directories deleted are:"
if [ $count == 0 ]
then
echo "Nothing to delete"
echo " "
else
ls -t1 | tail -n +4 | grep -v Current| xargs rm -r
fi
done
exit

预期结果是

~/test_dir/app1$ls -t1 | tail -n +3 | grep -v Current | xargs rm -r
~/test_dir/app1$ls -rlt
total 0
drwxr-xr-x  2 kk  10677    64B Apr 19 14:16 release4/
drwxr-xr-x  2 kk  10677    64B Apr 19 14:17 release8.9/
lrwxr-xr-x  1 kk  10677     8B Apr 19 14:18 Current@ -> release4

不应删除release4 /,它也指向符号链接和符号链接。任何帮助谢谢。

2 个答案:

答案 0 :(得分:0)

假设:

您只想保留最后修改的两个目录。
您根本不想删除符号链接。

kept=0
stat -c "%Y %n %F" * | sort -rn |
while read timestamp dir type
do [[ directory == "$type" ]] || continue
   ls -ld $dir/ # for logging only 
   if (( kept++ < 2 ))
   then echo "Keeping $dir"
   else echo "Removing $dir"
        rm -fr $dir
   fi
done

尽管您可以根据需要添加符号链接,但这根本不会解决符号链接。普通文件等也是如此。

... Don't parse ls

答案 1 :(得分:0)

SKIP="$(readlink Current@)";ls -trd release*|grep -v "^$SKIP$"|head -n -1|while read f;do rm -rf rela* "$f";done

编辑2:

OP稍微更改了规范:还有其他目录。

18.09/ 19.01/ 19.02/ 19.03/ 19.05/ 19.04/

我略微更改了“一个衬里”以同时捕捉到这一点:

[user123@matrix app1]$ mkdir 18.09/ 19.01/ 19.02/ 19.03/ 19.05/ 19.04/
[user123@matrix app1]$ ls -ltr
insgesamt 28
drwxrwxr-x. 2 user123 user123 4096 19. Apr 14:16 release4
lrwxrwxrwx. 1 user123 user123    8 19. Apr 14:18 Current@ -> release4
-rw-rw-r--. 1 user123 user123    0 20. Apr 01:45 1
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 19.05
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 19.04
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 19.03
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 19.02
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 19.01
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 18.09
[user123@matrix app1]$ SKIP="$(readlink Current@)";ls -tr|egrep -v "^$SKIP$|^Current@$"|head -n -1|while read f;do rm -rf "$f";done
[user123@matrix app1]$ ls -l
insgesamt 8
drwxrwxr-x. 2 user123 user123 4096 20. Apr 01:48 18.09
lrwxrwxrwx. 1 user123 user123    8 19. Apr 14:18 Current@ -> release4
drwxrwxr-x. 2 user123 user123 4096 19. Apr 14:16 release4
[user123@matrix app1]$