Как удалить все каталоги, кроме последних 2 каталогов и символическую ссылку, указанную на эти каталоги - PullRequest
0 голосов
/ 19 апреля 2019

У меня ниже структура каталогов.

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

Как сохранить или сохранить только последние два каталога, которые были изменены в последнее время, включая символические ссылки и соответствующие им каталоги, на которые они указывают?

Я пробовал ниже

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

но он даже удаляет каталоги, указывающие на символическую ссылку, оставляя только разорванную символическую ссылку.


#!/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 голосов
/ 19 апреля 2019
SKIP="$(readlink Current@)";ls -trd release*|grep -v "^$SKIP$"|head -n -1|while read f;do rm -rf rela* "$f";done

РЕДАКТИРОВАТЬ 2:

ОП слегка изменил спецификацию: есть и другие каталоги.

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]$
0 голосов
/ 19 апреля 2019

Допущения:

Вы хотите сохранить только два последних измененных каталога.
Вы вообще не хотите удалять символические ссылки.

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

Это вообще не будет касаться символических ссылок, хотя мы могли бы добавить это, если хотите.То же самое верно для простых файлов и т. Д.

... Не анализировать ls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...