Далее, в строке
, сценарий unrm проверяет, не затрет ли он существующий файл, и затем восстанавливает файл или каталог вызовом команды /bin/mv. После этого в
пользователю дается возможность удалить все остальные (вероятно, избыточные) копии файла, и сценарий завершается.
Обратите внимание, что команда ls с шаблоном *"$1" найдет все файлы, имена которых оканчиваются значением параметра $1, поэтому список с «совпавшими файлами» может содержать не только файл, который пользователь хотел бы восстановить. Например, если удаляемый каталог содержал файлы 11.txt и 111.txt , команда unrm 11.txt сообщит, что найдено несколько совпадений и вернет список с обоими файлами, 11.txt и 111.txt . На первый взгляд в этом нет ничего страшного, но как только пользователь выберет файл для восстановления ( 11.txt ) и ответит утвердительно на предложение удалить другие копии, сценарий удалит также файл 111.txt . Такое поведение по умолчанию в некоторых случаях может оказаться нежелательным. Однако это легко исправить, использовав шаблон??.??.??.??.??."$1", если в сценарии newrm сохранен формат префикса в именах копий.
Сценарий можно запустить двумя способами. Если запустить его без аргументов, он выведет список всех файлов и каталогов в архиве удаленных файлов.
Если передать сценарию аргумент с именем файла, он попытается восстановить этот файл или каталог (если найдет только одно совпадение) или выведет список найденных кандидатов на восстановление и предложит пользователю выбрать нужную версию файла или каталога.
При запуске без аргументов сценарий выведет список всех файлов и каталогов в архиве удаленных файлов, как показано в листинге 2.8.
Листинг 2.8.При запуске без аргументов сценарий unrm выведет список файлов и каталогов, доступных для восстановления
$ unrm
Contents of your deleted files archive (sorted by date):
··detritus··················this is a test
··detritus··················garbage
Получив аргумент с именем файла, сценарий выведет больше информации о файлах, если найдет несколько совпадений с указанным именем, как показано в листинге 2.9.
Листинг 2.9.При запуске с единственным аргументом сценарий unrm попытается восстановить файл
$ unrm detritus
More than one file or directory match in the archive:
··1) detritus (size = 7688Kb, deleted = 11/29 at 10:00:12)
··2) detritus (size = 4Kb, deleted = 11/29 at 09:59:51)
Which version of detritus should I restore ('0' to quit)? [1]: 0
unrm: Restore canceled by user.
Усовершенствование сценария
Используйте этот сценарий внимательно, потому что в нем не выполняется никаких проверок и отсутствуют всякие ограничения. Объем архива с удаленными файлами будет расти без всяких ограничений. Чтобы избежать исчерпания дискового пространства, создайте задание для cron, вызывающее команду find, для очистки удаленных файлов, с флагом −mtime, чтобы выявить файлы, остававшиеся невостребованными в течение нескольких недель. 14-дневного срока хранения в архиве, вероятно, будет вполне достаточно и для большинства пользователей, и для того, чтобы предотвратить исчерпание дискового пространства.
Можно также внести ряд других усовершенствований, которые сделают сценарий более дружественным для пользователя. Например, добавить флаг −l для восстановления последней (latest) копии и флаг−D для удаления дополнительных копий файла. Подумайте, какие еще флаги вы добавили бы, чтобы упростить работу со сценарием?
№ 17. Журналирование операций удаления файлов
Вместо архивирования удаляемых файлов иногда достаточно просто фиксировать факты удаления. В листинге 2.10 приводится сценарий, который журналирует вызовы команды rm в отдельном файле, ни о чем не извещая пользователя.
Такого эффекта можно добиться, использовав сценарий в роли обертки. Основная идея любой обертки состоит в том, что она располагается между фактической командой Unix и пользователем, предлагая дополнительные возможности, недоступные в оригинальной команде.
ПРИМЕЧАНИЕ
Обертки — мощная концепция, и в этой книге вы еще не раз встретитесь с ней.
Листинг 2.10.Сценарий logrm
··#!/bin/bash
··# logrm — журналирует все операции удаления файлов, если вызывается без флага −s
··removelog="/var/log/remove.log"
··if [$# −eq 0]; then
Читать дальше