Як видалити групу папок на основі імені та дати


5

У мене така структура папок.

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

Це всі папки. Мені потрібно видалити всі папки, які починаються з тесту, за винятком останньої. У мене також є доступ до імені папки останнього $ {newestTestFolder}.

Відповіді:


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 і засобами

  • !() - ні шаблон всередині
  • @() - один моделі
  • | - відокремлює візерунки

приємно. але я думаю, це включає в себе нову назву папки вручну? і ви видалили лише найновішу замість того, щоб залишити лише цю - але це, звичайно, детально ..
mnmnc

@mnmnc: Так, це зовсім не дивиться на мітки часу. На запитання сказано, що назва була доступна в змінну. Ні, я видаляю старе test* каталоги з цією командою. Ті самі каталоги, які відображаються з останніми ls Команда в першому розділі - це ті, які слід видалити з показаним пізніше rm команду.
Daniel Andersson

Під час роботи ls -d1 !(@(${newestTestFolder}|!(test*))) я отримав -bash: !: event not found Я спробував вирватися з
yellavon

@yellavon: увімкнено extglob як показано? Проблема shopt -s extglob. Що стосується цього питання - ви використовуєте Bash? Інакше це буде ні робота :-)
Daniel Andersson

Так, мені просто потрібно включити extglob. Дякую.
yellavon

1

Скористайтеся цим: (Я змінив його, щоб призначати лише папки, які починаються з тесту)

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

1
Це буде невдало, якщо в них є каталоги з пробілами. Крім того, він не буде ігнорувати каталоги, названі, наприклад, latestтобто не початок с test.
Daniel Andersson

@DanielAndersson я оновив свою відповідь. Її надійний простір в іменах папок і не буде видаляти папки latest
mnmnc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.