Можно ли настроить редактор ed для автоматического создания резервных файлов?

Вопрос или проблема

Существует ли способ заставить ed создавать резервные копии файла, который в данный момент загружен в буфер? Иногда я случайно перезаписываю свой файл и обнаруживаю, что его невозможно восстановить. То есть, создание резервной копии файла с тильдой, добавленной к оригинальному имени файла (например, myfile.txt~), которая будет содержать предыдущую версию файла.

Редактор ed не предоставляет функции резервного копирования (или какого-либо способа ее настройки). Запись редактируемого буфера обратно на диск с помощью команды w перезаписывает оригинальный файл.

Вам необходимо редактировать копию ваших оригинальных данных или сохранить текст под новым именем файла, либо используя w some-filename, либо с помощью f some-filename, чтобы задать имя файла в начале сеанса редактирования, а затем использовать w, когда вы хотите записать буфер в файл.

Некоторые современные файловые системы предоставляют функции создания снимков, которые позволяют вам восстановить перезаписанные данные или, если вы перезаписали их по ошибке, получить их из недавней резервной копии.

vi, который можно было легко модифицировать для поддержки ed или любого другого инструмента изменения файлов. Он создает резервную копию файла перед запуском редактора, а когда редактор заканчивает, он сравнивает результат с оригиналом.

Суть примерно такая. Это определенно не идеально — например, он зависнет, если у вас имя файла, начинающееся с дефиса (-) — но это работает для меня, и может сработать и для вас.

#!/bin/sh
#
editor="ed"                 # Извлеките это из "$0", если хотите сделать это изящнее
date=$(date +'%Y-%m-%d')    # Используйте дату/время, если хотите большей точности

# Сохраните каждый файл
for file in "$@"
do
    [ -f "$file" ] && cp -pf "$file" "$file.$date.$$.tmp"
done

# Отредактируйте файл(ы), используя ваш предпочтительный редактор
"$editor" "$@"
ss=$?

# Сравните отредактированные и сохраненные копии
for file in "$@"
do
    tmpf="$file.$date.$$.tmp"

    if [ -f "$tmpf" ]
    then
        if [ ! -f "$file" ] || ! cmp -s "$file" "$tmpf"
        then
            # Сохраните сохраненную копию как резервную
            [ ! -f "$file.$date" ] && mv -f "$tmpf" "$file.$date"
        fi

        # Удалите временно сохраненную копию независимо от всего
        rm -f "$tmpf"
    fi
done

# Верните код выхода из самого редактора
exit $ss

Я бы назвал это чем-то вроде bed (резервный редактор) или bvi и использовал бы все, кроме первой буквы имени программы, чтобы извлечь $editor:

progname=${0##*/}       # Имя программы (без пути)
editor=${progname#?}    # Редактор, который использовать

Ответ или решение

К сожалению, редактор ed не поддерживает автоматическое создание резервных копий файлов при редактировании. Это связано с тем, что ed является довольно простым текстовым редактором, который не предоставляет функционала для настройки и создания резервных копий. При выполнении команды w (write) файл, открытый в редакторе, будет перезаписан, и прежние версии не сохраняются.

Возможные решения

Несмотря на отсутствие встроенной функции резервного копирования, есть несколько обходных путей и стратегий, которые могут помочь защитить ваши данные.

  1. Создание копий вручную: Вы можете создать резервные копии оригинальных файлов перед их редактированием. Например, выполнить команду cp myfile.txt myfile.txt.bak перед началом редактирования. Это позволит вам в любой момент восстановить состояние файла до редактирования.

  2. Использование внешнего скрипта: Как было предложено, вы можете написать скрипт-обертку, который будет автоматически создавать резервные копии файлов перед их редактированием в ed. Пример такого скрипта описан в вашем вопросе. Он создает временные резервные копии с добавлением даты и идентификатора процесса к имени файла, а затем, после завершения редактирования, сравнивает изменённый файл с резервной копией и сохраняет её, если произошли изменения.

    Вот краткая схема работы скрипта:

    #!/bin/sh
    editor="ed"                 # Редактор, который хотите использовать
    date=$(date +'%Y-%m-%d')    # Текущая дата
    
    # Создание резервных копий
    for file in "$@"
    do
       [ -f "$file" ] && cp -pf "$file" "$file.$date.$$.tmp"
    done
    
    # Запуск редактора
    "$editor" "$@"
    ss=$?
    
    # Сравнение файлов
    for file in "$@"
    do
       tmpf="$file.$date.$$.tmp"
       if [ -f "$tmpf" ]; then
           if [ ! -f "$file" ] || ! cmp -s "$file" "$tmpf"; then
               mv -f "$tmpf" "$file.$date"
           fi
           rm -f "$tmpf"
       fi
    done
    
    exit $ss
  3. Обращение к файловым системам с функцией снимков: Некоторые современные файловые системы поддерживают функцию снимков (snapshot), что позволяет извлекать данные, которые были перезаписаны. Это может быть полезным в случае, если вы случайно изменили или потеряли файл.

Заключение

Хотя редактор ed сам по себе не поддерживает автоматическое создание резервных копий, вы можете использовать вспомогательные методы, такие как написание скриптов, создание резервных копий вручную или использование возможностей вашей файловой системы. Это поможет вам защитить ваши данные и избежать потери важных версий файлов.

Оцените материал
Добавить комментарий

Капча загружается...