117
существует. Опция полезна, когда нет уверенности в существовании
удаляемого файла и его отсутствие не является ошибкой.
Для удаления файла желательно иметь право на запись в него
(обязательным является наличие права на запись в каталог, содержащий
удаляемую ссылку). Если такого права нет, то утилита rm запрашивает
подтверждение.
В общем случае подтверждение на удаление запрашивается при
выполнении следующего условия:
• (не задана опция -f) И
• (((отсутствует право на запись в файл) И
• (стандартный ввод назначен на терминал)) ИЛИ
• (задана опция -i)))
Наконец, две эквивалентные "сверхмощные" опции -R и -r (первая
предусмотрена стандартом POSIX, вторая поддерживается по
историческим причинам) позволяют удалять каталоги со всем их
содержимым (если, конечно, хватает прав). Так, в процессе загрузки
некоторых Unix-систем выполняется команда, которая удаляет каталог
/tmp и все содержащиеся в нем файлы и подкаталоги:
rm -rf /tmp
Разумеется, пользоваться опцией -R следует крайне осторожно, но
без нее удалить каталог с помощью утилиты rm невозможно (по
умолчанию удаляемый файл не может быть каталогом). Отметим также,
что rm удаляет символьные ссылки, а не указуемые файлы.
Для удаления каталогов (правда, только пустых) рекомендуется
использовать служебную программу rmdir (или одноименную функцию).
Опция -p предписывает удалять всю цепочку каталогов, составляющих
заданное маршрутное имя. Например, если в текущем каталоге есть
подкаталог a, содержащий только пустой подкаталог b, то команда,
показанная в листинге 4.41, удалит и b, и a.
rm -p a/b
Листинг 4.41. Пример команды удаления цепочки каталогов.
Функция unlink() предназначена для удаления файлов, не
являющихся каталогами, а функция remove(), имеющая в стандарте C99
[5], объединяет возможности функций rmdir() и unlink().
В листинге 4.42 приведен пример программы, которая с помощью
функций link() и unlink() осуществляет ответственную обработку файлов
с сохранением копии текущей версии.
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
/* Программа выполняет обработку */
/* с осторожным замещением */
/* основного файла рабочим */
#define MAIN_FILE "/home/galat/garb/temp/mfile"