Чтобы решить эту проблему, нужно организовать тайное и автоматическое архивирование файлов и каталогов в архив .deleted-files . Немного подумав, можно написать сценарий (представленный в листинге 2.5), который сделает все это почти незаметно для пользователя.
Листинг 2.5.Сценарий newrm, копирующий файлы перед удалением с диска
··#!/bin/bash
··# newrm — замена существующей команды rm.
··#·· Этот сценарий предоставляет простую возможность восстановления, создавая и
··#·· используя новый каталог в домашнем каталоге пользователя. Может обрабатывать
··#·· каталоги и отдельные файлы. Если пользователь добавляет флаг −f, файлы
··#·· удаляются БЕЗ архивирования.
··# Важное предупреждение: возможно, вам понадобится создать задание для cron или
··#·· нечто подобное для очистки удаленных каталогов и файлов через некоторое
··#·· время. Иначе файлы не будут удаляться из системы и вы рискуете исчерпать
··#·· дисковое пространство!
··archivedir="$HOME/.deleted-files"
··realrm="$(which rm)"
··copy="$(which cp) −R"
··if [$# −eq 0]; then # Позволить 'rm’ вывести сообщение о порядке использования.
····exec $realrm # Our shell is replaced by /bin/rm.
··fi
··# Проверить все параметры на наличие флага '-f’
··flags=""
··while getopts "dfiPRrvW" opt
··do
····case $opt in
······f) exec $realrm "$@"····;; # exec позволяет покинуть сценарий немедленно.
······*) flags="$flags −$opt";; # Другие флаги предназначены команде rm.
····esac
··done
··shift $(($OPTIND — 1))
··# НАЧАЛО ОСНОВНОГО СЦЕНАРИЯ
··# =================
··# Гарантировать наличие каталога $archivedir.
··if [! -d $archivedir]; then
····if [! -w $HOME]; then
······echo "$0 failed: can't create $archivedir in $HOME" >&2
······exit 1
····fi
····mkdir $archivedir
····chmod 700 $archivedir # Ограничить доступ к каталогу.
··fi
··for arg
··do
····newname="$archivedir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")"
····if [-f "$arg" −o — d "$arg"]; then
······$copy "$arg" "$newname"
····fi
··done
··exec $realrm $flags "$@" # Текущий сценарий будет вытеснен командой realrm.
В этом сценарии есть много интересных аспектов, в основном связанных с необходимостью скрыть его работу от пользователя. Например, сценарий не генерирует сообщений об ошибках в ситуациях, когда обнаруживает, что не может продолжить работу; он просто позволяет команде realrm самой сгенерировать такое сообщение, вызывая (обычно) /bin/rm с иногда ошибочными параметрами. Вызов realrm производится с помощью команды exec, которая замещает текущий процесс новым, выполняющим указанную команду. Сразу после вызова команды exec realrm
текущий сценарий фактически прекращает работу, и в вызывающую командную оболочку передается код возврата, генерируемый процессом realrm.
Поскольку сценарий втайне создает в домашнем каталоге пользователя новый каталог
, он должен гарантировать, что хранимые в нем файлы не окажутся доступны для других только из-за неправильно настроенного значения umask. (Значение umask определяет привилегии доступа по умолчанию для создаваемых файлов и каталогов.) Чтобы избежать непреднамеренного открытия доступа к резервируемым файлам, сценарий вызывает в строке
команду chmod, дающую право на доступ к каталогу только для текущего пользователя.
Наконец, в строке
сценарий использует basename для удаления любой информации о каталоге из пути к файлу и добавляет в имя файла дату и время удаления в формате: секунды. минуты. часы. день. месяц. имя_файла :
newname="$archivedir/$(date "+"%S.%M.%H.%d.%m").$(basename "$arg")"
Обратите внимание на использование нескольких элементов $() для формирования нового имени файла. Хотя это немного усложняет сценарий, тем не менее такое решение эффективно. Напомним, что содержимое, заключенное между $(и) выполняется в подоболочке, а результат замещает выражение в скобках.
Но зачем усложнять реализацию добавлением даты и времени в имя резервируемого файла? Чтобы дать возможность сохранять несколько копий удаляемого файла с одним и тем же именем. После архивирования файла сценарием нельзя будет отличить /home/oops.txt от /home/subdir/oops.txt иначе как по времени удаления. Если стирание одноименных файлов произойдет одновременно (или в течение одной секунды), резервные копии файлов, удаленных первыми, будут затерты. Для решения этой проблемы можно организовать добавление абсолютных путей к оригинальным файлам в имена резервных копий.
Читать дальше