При удалении каталога необходимо рекурсивно удалить его содержимое. Почему это так?
Упрощая, можно сказать, что «каталог» - это файл, содержащий список пар.Что произойдет, если вы просто «освободите блоки каталога на диске»?
Рассмотрим удаление обычных файлов. Программа (например, rm
) вызывает системный вызов unlink ()
. Операционная система (а точнее, драйвер файловой системы) проверяет количество жестких ссылок ( имя_файла
в каталоге в предыдущем абзаце). Если он равен нулю и файл не открывается, его можно удалить физически. Таким образом, мы знаем, как удалить файл.
Теперь давайте снова вернемся к удалению каталога. Когда вы просто освобождаете блоки, вы не разъединяете в нем
файлы, вы не уменьшаете счетчик жестких ссылок для любого файла в каталоге. И для любого файла в подкаталогах, подкаталогах и т. Д. Какой вывод? Точно, нам нужно выполнить unlink
для всех файлов в каталоге, который мы удаляем, потому что мы не хотим получать неизвлекаемый мусор в файловой системе.
Таким образом, вы можете использовать решение @ SYN (запускающее rm
в фоновом режиме), но нет способа удалить каталог за постоянное время.
Если путь начинается с /
, он начинается с корня (т. Е. Каталога, у которого нет родителя¹). Если путь не начинается с /
, он начинается с текущего каталога.
Есть два специальных имени каталога: .
всегда относится к текущему каталогу, а ..
всегда относится к родительскому элементу текущего каталога. Итак, если вы находитесь в D
, который является подкаталогом K
, тогда вы можете ссылаться на K
как ..
. Если вы находитесь в D
, то простой K
означает подкаталог D
под названием K
, что вам не нужно.
Таким образом, вы ищете команду
mv ../K/H ../K/B/
Вы также можете использовать абсолютные пути, но вам нужно будет указать весь путь от корня. Например. если K
на самом деле является / home / henri / plays / 1 / K
, тогда вы можете написать
mv /home/henri/exercises/1/K/H /home/henri/exercises/1/K/B/
¹ Технически корневой каталог на самом деле является собственным родительским каталогом.