Ответы:
Bash расширил сглаживание (сначала проверьте, затем удалите эхо):
shopt -s extglob
echo rm -rf !(A)
shopt | grep ext
вы можете увидеть , если плагин включен.
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
Что о:
mv A /tmp/
rm * -rf
mv /tmp/A .
Это позволяет избежать некоторой «шаткости» опечатки в других командах.
Что-то типа
find . -type d -not -name A -exec rm -ir {} \;
стоит сделать.
редактировать
Это действительно должно быть
find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;
чтобы предотвратить find
повторение ниже A.
Я обычно делаю это, работая над командой ls, которая в первую очередь понимает это правильно. я не на Unix-машине, но что-то вроде:
ls -lda "[^ A]"
Как только вы поймете это правильно, направьте его в команду
ls -lda "[^ A]" | xargs rm -rf
Не стесняйтесь редактировать выше, если я неправильно понял свое регулярное выражение ...
Вот один из способов. Будьте осторожны с такими вещами, хотя, они настолько мощные, что их можно использовать только для добра или зла ...
найти * -типа d | grep -v "^ A" | xargs rm -rf
Не используйте find, как некоторые люди показали с -exec и rm, не передавая -print0 для поиска и -0 для xargs. Это будет путать в именах файлов с пробелами или символами новой строки:
$ mkdir 'foo foo'
$ mkdir foo$'\n'foo
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory
Вместо этого используйте find -print0 с xargs -0, '-exec command {} +' или -delete, если ваш поиск поддерживает это.
Смотрите также здесь:
/programming/862388/delete-all-files-directories-except-two-specific-directories