5

У меня есть структура папок, как это.

folders
    test1
    test2.1
    test49.85
    test4.95.89
    sample
    support
    util

Это все папки. Мне нужно удалить все папки, которые начинаются с теста, кроме самой последней. У меня также есть доступ к имени папки самого последнего $ {newestTestFolder}.

2 ответа2

4

Использование extglob в Bash:

$ ls -1
sample
support
test1
test2.1
test4.95.89
test49.85
util
$ newestTestFolder="test49.85"
$ shopt -s extglob
$ ls -d1 !(@(${newestTestFolder}|!(test*)))
test1
test2.1
test4.95.89

Это показывает, что

$ rm -r !(@(${newestTestFolder}|!(test*)))

делает то, что вы хотите, в одной команде все в Bash (с включенным extglob) - никаких дополнительных вызовов процессов (ну, rm).

Шаблон объясняется в руководстве Bash и означает

  • !() - не шаблон внутри
  • @() - один из шаблонов внутри
  • | - разделяет узоры
1

Используйте это: (Я изменил его, чтобы grep только папки, которые начинаются с теста)

for i in `\ls -1 --sort time | grep ^test | tr '\n' ' ' | cut -d " " -f 2-`; 
do 
     rm -r "$i"; 
done

Ага. Работает для меня:

 ~ > ls
total 24
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test1
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test2
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test3
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test4
 ~ > for i in `\ls -1 --sort time | grep ^test | tr '\n' ' ' | cut -d " " -f 2-`;
>     do
>          rm -r "$i";
>     done
 ~ > ls
total 12
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test4
 ~ >

Остались только самая младшая папка и папка, которая не соответствует test Моя версия универсальна - вам не нужно указывать имя самой младшей тестовой папки.

А что касается комментария ниже - вы можете использовать следующую строку for выражения

\ls -1 --sort time | grep ^test | tr ' ' '#' | tr '\n' ' ' | cut -d " " -f 2- | tr '#' ' '

если вы ожидаете пробелы в именах папок. Я использовал # как необычный символ, который вряд ли будет в именах папок. Вы можете использовать другое, если вы ожидаете иметь пробелы или символы # . Вы можете изменить # на комбинацию символов, чтобы ограничить риск.

Доказательство, что это работает:

 ~ > ls
total 36
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test1
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test2
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test3
drwxr-xr-x 2 root root 4096 2012-08-24 19:20 test 4
drwxr-xr-x 2 root root 4096 2012-08-24 19:20 test5
drwxr-xr-x 2 root root 4096 2012-08-24 19:21 test 6
 ~ > for i in `\ls -1 --sort time | grep ^test | tr ' ' '#' | tr '\n' ' ' | cut -d " " -f 2- | tr '#' ' '`;
>     do
>          rm -r "$i";
>     done
 ~ > ls
total 12
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:21 test 6
 ~ >

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .