Удаление каталога в Linux
Для удаления каталога в Linux имеется специальная команда rmdir:
rmdir <Имя_Директории>
Однако особенность этой команды состоит в том, что она умеет удалять только пустые директории. Почему эту команду не стали развивать и не добавили в нее естественную возможность удалять любую заданную пользователем директорию - хоть с файлами, хоть с подкаталогами, - совершенно непонятно.
Поэтому в Linux принято удалять директорию с помощью команды удаления файла, ссылаясь на то, что директория - это по-сути тоже файл, только с определенными атрибутами, благодаря которым операционная система на уровне файловой подсистемы воспринимает такой файл как директорию. Эта команда называется rm (сокращение от remove).
Удалить директорию со всеми файлами, лежащими в ней и поддиректориями можно такой командой:
rm -R <Имя_Директории>
Для того, чтобы команда не запрашивала подтверждения на удаление, можно добавить флаг -f (что значит force), причем флаги можно объединять с другими флагами. Таким образом команда, которая гарантированно удалит каталог, ничего дополнительно не спрашивая, будет следующей:
rm -Rf <Имя_Директории>
Естественно, удаление каталога будет возможно только в том случае, если у пользователя достаточно прав на директорию и файлы/подкаталоги внутри этой директории.
Удаление содержимого каталога в Linux
Иногда нужно удалить не сам каталог, а только содержимое каталога. Проблема в том, что в Linux есть dot-файлы и dot-каталоги (т. е. файлы/каталоги, имя которых начинаются с точки), которые считаются скрытыми. И они не удаляются без специальных опций. Поэтому для удаления часто используют команду find, которая "находит все" внутри каталога, и это все удаляет. Достаточно странное решение, но оно необходимо в Linux (см. далее).
Тем не менее, есть форма команды rm, которая полностью удалит содержимое каталога, включая скрытые файлы и каталоги:
rm -Rf /home/user/Downloads/{*,.*}
Казалось бы, что может пойти не так? Но у этой команды есть небольшой "сюрприз".
С одной стороны, данная команда очистит содержимое пользовательского каталога Downloads со всеми его подкаталогами. Получится полностью пустая директория. Вроде бы, это именно то, что нужно.
Однако, у данной команды имеется одна небольшая проблема. При удалении она всегда пытается удалить каталоги с именами "." и "..", которые она же не может удалить:
rm: отклонение удаления '.' или каталога '..': пропускается '/home/user/Downloads/.'
rm: отклонение удаления '.' или каталога '..': пропускается '/home/user/Downloads/..'
И поэтому код возврата у такой команды всегда будет ненуливой, то есть всегда данная команда завершается ошибкой. Чтобы этого не происходило, можно добавлять в такую команду вызов утилиты true:
rm -rf /home/user/Downloads/{*,.*} ; true
Но тогда, например, если при удалении не будет хватать прав на удаление, то скрипт, который использует эту команду, об этом даже не узнает.
По вышеуказанным причинам, в Linux, для удаления каталога, ничего не остается, как воспользоваться командой find:
find /home/user/Downloads -mindepth 1 -delete
или, в более старом синтаксисе (при отсутсвии поддержки опции -delete):
find /home/user/Downloads -mindepth 1 -exec rm -rf {}
Здесь опция -mindepth 1 означает буквально следующее: "Using -mindepth 1 means process all files except the starting-points". То есть при использовании данной опции будут обрабатываться все файлы и директории, за исключанием самой начальной директории.