Відповіді:
Bash розширив глобус (спочатку тест, потім видаліть відлуння):
shopt -s extglob
echo rm -rf !(A)
shopt | grep ext
Ви можете бачити, чи увімкнено плагін.
А як на рахунок:
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
Не використовуйте пошук, як показали деякі люди із -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 командою {} +' або -delete, якщо ваша знахідка підтримує це.
Дивіться також тут:
/programming/862388/delete-all-files-directories-except-two-specific-directories