简体   繁体   English

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

[英]How to delete all directories except last 2 directories and the symlink pointed to those directories

I have below directory structure.我有以下目录结构。

~/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_dir🍺ls -t1 | tail -n +3 | grep -v Current
relase23/
release5/
release4/
release3/
release2/
release1/

How to keep or preserve only the last two directories which are modified recently including the symlinks and their respective directories pointed to them?如何仅保留或保留最近修改的最后两个目录,包括符号链接及其指向它们的各自目录?

I have tried the below我已经尝试过以下

~/test_dir🍺ls -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

but that one is even deleting the directories pointing to symlink , keeping only the broken 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

Expected results are预期结果是

~/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

The release4/ shouldn't get deleted which points to symlink and the symlink too. release4/ 不应该被删除,它也指向符号链接和符号链接。 Any help Thanks.任何帮助谢谢。

Assumptions:假设:

You want to retain only the two directories last modified.您只想保留上次修改的两个目录。
You do not want to remove symlinks at all.您根本不想删除符号链接。

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

This will not address symlinks at all, though we could add that if you want it.这根本不会解决符号链接,尽管我们可以根据需要添加它。 The same is true for plain files, etc.对于普通文件等也是如此。

... Don't parse ls ...不要解析ls

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

EDIT 2:编辑2:

The OP changed the specification slightly: There are also other directories. OP 稍微更改了规范:还有其他目录。

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

I slightly changed the "one liner" to capture also THIS:我稍微改变了“一个班轮”来捕捉这个:

[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]$

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM