MyTetra Share
Делитесь знаниями!
Как удалить каталог и как очистить каталог в Linux?
Время создания: 20.10.2022 08:55
Текстовые метки: linux, bash, команда, удаление, каталог, директория, папка, очистить, пустой, содержимое, файлы
Раздел: Компьютер - Linux - Bash - Команды и скрипты
Запись: xintrea/mytetra_syncro/master/base/16662453220yup9ub9lh/text.html на raw.github.com

Удаление каталога в 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". То есть при использовании данной опции будут обрабатываться все файлы и директории, за исключанием самой начальной директории.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования