Відповіді:
Використання 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