суббота, 7 января 2012 г.

Bash: удаление всех директорий кроме указанной

Можно обойтись простой командой:

rm -rf $(ls -d */ | grep -v SAVETHISDIRECTORY)

Здесь список директорий передается как параметр команды rm с помощью блока $(). Параметр -d у ls необходим для вывода лишь каталогов.

Еще один вариант

find -maxdepth 1 -mindepth 1 -type d ! -name 'SAVETHISDIRECTORY' -exec rm -rf {} \;

В этом случае используется вызов команды rm -rf для всех найденных директорий в текущем каталоге, исключая указанную.
Параметры maxdepth 1 и mindepth 1 нужны для того, чтобы не удалялись вложенные директории внутри SAVETHISDIRECTORY, а также чтобы не производилось попытки удалить текущий каталог (".").
-type d необходим для поиска только директорий.
Самая важная часть здесь - это ! -name 'SAVETHISDIRECTORY'. Она указывает find на то, что необходимо пропустить ("!") все элементы, имя которых ("-name") соответствует шаблону SAVETHISDIRECTORY.
Ну и -exec rm -rf {} \; удаляет все найденные find каталоги.