ls: /Users/taylor/.deleted-files/: No such file or directory
$ newrm file-to-keep-forever
$ ls ~/.deleted-files/
51.36.16.25.03.file-to-keep-forever
Что и требовалось получить. Файл был удален из локального каталога и скрытно перемещен в каталог
Усовершенствование сценария
Как одно из усовершенствований можно предложить изменить префикс со временем, чтобы упростить вывод списка копий удаленных файлов командой ls в обратном хронологическом порядке. Ниже показана строка из сценария, подлежащая изменению:
newname="$archivedir/$(date "+"%S.%M.%H.%d.%m").$(basename "$arg")"
Можно изменить порядок следования компонентов в новом имени на противоположный, чтобы исходное имя файла следовало первым, а за ним — дата удаления в секундах. Далее, поскольку время измеряется с точностью до секунды, может так получиться, что при одновременном удалении одноименных файлов из разных каталогов (например, rm test testdir/test) произойдет затирание одной копии удаленного файла другой. Поэтому, как еще одно полезное усовершенствование, можно добавить в имя архивируемого файла его прежнее местоположение, чтобы в результате получить, например, файлы
№ 16. Работа с архивом удаленных файлов
Теперь, когда в домашней папке пользователя появился скрытый каталог с удаленными файлами, пригодился бы сценарий, позволяющий выбирать для восстановления одну из нескольких удаленных версий. Однако эта задача сложна тем, что нам придется предусмотреть все вероятные проблемы: от невозможности найти требуемый файл до обнаружения нескольких копий, соответствующих заданному критерию. Например, если обнаружится несколько совпадений, какую копию должен восстановить сценарий — самую старую или самую новую? Или он должен вывести сообщение об ошибке, указав в нем количество найденных совпадений? Или вывести список версий и предложить пользователю выбрать нужную? Давайте посмотрим, как решаются эти проблемы на практике, изучив сценарий 2.7, в котором приводится сценарий командной оболочки unrm.
Код
Листинг 2.7. Сценарий unrm для восстановления файлов из резервных копий
··#!/bin/bash
··# unrm — отыскивает в архиве удаленных файлов требуемый файл или
··#·· каталог. Если найдено более одного совпадения, выводит список
··#·· результатов поиска, упорядоченных по времени, и предлагает
··#·· пользователю выбрать нужный для восстановления.
··archivedir="$HOME/.deleted-files"
··realrm="$(which rm)"
··move="$(which mv)"
··dest=$(pwd)
··if [! -d $archivedir]; then
····echo "$0: No deleted files directory: nothing to unrm" >&2
····exit 1
··fi
··cd $archivedir
··# Если сценарий запущен без аргументов, просто вывести список
··#·· удаленных файлов.
····echo "Contents of your deleted files archive (sorted by date):"
······-e 's/^/ /’
····exit 0
··fi
··# Иначе принять шаблон для поиска, предложенный пользователем.
··#·· Проверить наличие в архиве нескольких совпадений с шаблоном
··if [$matches −eq 0]; then
····echo "No match for \"$1\" in the deleted file archive." >&2
····exit 1
··fi
····echo "More than one file or directory match in the archive: "
····index=1
····for name in $(ls −td *"$1")
····do