Відповіді:
Використання 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 і засобами
!()
- ні шаблон всередині @()
- один моделі |
- відокремлює візерунки test*
каталоги з цією командою. Ті самі каталоги, які відображаються з останніми ls
Команда в першому розділі - це ті, які слід видалити з показаним пізніше rm
команду.
ls -d1 !(@(${newestTestFolder}|!(test*)))
я отримав -bash: !: event not found
Я спробував вирватися з
extglob
як показано? Проблема shopt -s extglob
. Що стосується цього питання - ви використовуєте Bash? Інакше це буде ні робота :-)
Скористайтеся цим: (Я змінив його, щоб призначати лише папки, які починаються з тесту)
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
~ >
latest
тобто не початок с test
.
latest