Как создать резервные копии с временными метками для определенных файлов, которые я редактирую?

x11 , а не Wayland

Я часто редактирую различные текстовые файлы, такие как .css, .mkd, .sh и .txt, а также .odt Файлы и .ods .

Все мои файлы имеют

Geany 1.32 поставляется с настраиваемым плагином для автоматического сохранения резервной копии с меткой времени в месте назначения по выбору пользователя. Например, временная резервная копия ~ / .bashrc выглядит следующим образом:

/home/dkb/Public/GeanyBackups/.bashrc.2019-08-28-16-25-51

Geany allows timestamped backups

Гедит предложил нечто подобное лет назад. Восстановление этой функции может быть по-прежнему возможно с помощью плагина Manage External Tools…. Ответы здесь иллюстрируют использование этого плагина.

Насколько мне известно, в других текстовых редакторах, таких как featherpad , kate , leafpad и коврик для мыши , нет такая особенность. Даже LibreOffice сохраняет только одну резервную копию (если она включена в Инструменты> Параметры> LibreOffice> Загрузить / Сохранить ).

Можно использовать rsync для резервного копирования файлов в папки с метками времени, но я хочу делать резервные копии довольно частых изменений в месте назначения по своему выбору.

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

2
задан 28 August 2019 в 14:18

2 ответа

Я придумал следующий сценарий, timestamp.sh, и присвоил Ctrl+Super+T для выполнения его.

#!/bin/bash

xgg="$(xdotool getactivewindow getwindowname)"

if [[ "$xgg" == *" - gedit" ]]

  then

    sleep 1 && xdotool key "ctrl+s"

  else

    sleep 0.3 && xdotool key "alt+f" && sleep 0.1 && xdotool key s

fi

nwt(){
    find ~/ \
    ! -path "$HOME/.mozilla/*" \
    ! -path "$HOME/.config/libreoffice/*" \
    ! -path "$HOME/Public/*" \
    ! -path "$HOME/.local/share/Trash/*" \
    ! -path "$HOME/.config/google-chrome/*" \
    \( -name "*ods" \
    -o -name "*txt" \
    -o -name "*html" \
    -o -name "*odt" \
    -o -name ".bashrc" \
    -o -name ".bash_aliases" \
    -o -name "*\.sh" \
    -o -name "*\.mkd" \) \
    -type f  -printf '%T@ %p\n' | sort -r | head -1 | cut -f2- -d ' '
}

s=$(nwt)

sleep 2 && cp $(nwt) $HOME/Public/"${s##*/}-$(date '+%Y%m%d%H%M%S')"
  • сценарий использует xdotool, чтобы моделировать нажатия клавиш и обнаружить заголовок окна, потому что gedit отличается, чем другие редакторы, в которых он не использует Alt+F+S "прежней версии".

  • часть кода в nwt отсюда.

  • использование ${s##*/} описан здесь.

  • сны не могут быть необходимы на машине с хорошими спецификациями.

Результирующее резервное имя файла похоже на это:

/home/dkb/Public/find-Carla-Schroder.mkd-20190829222116
0
ответ дан 2 December 2019 в 03:27

Автоматические резервные копии с меткой времени (любого) определенного файла

Если Вы не боитесь компиляции a vala файл, отрывок ниже может использоваться. Преимущество состоит в том, что это основано на сигнале (использование FileMonitor) и потребление ресурсов является нулем. Кроме того, Вам не нужно дополнительное ручное действие.

Как это работает

  • Просто выполните исполняемый файл с наблюдаемым файлом и целенаправленным каталогом (для сохранения резервных копий на) как аргументы, например.

    '/home/jacob/Desktop/watch_out' '/home/jacob/Desktop/test' '/home/jacob/Desktop'
    

    Каждый раз файл test сохраняется (так измененный) на диске, резервном копировании как:

    2019-08-29_09-14-26_test
    

    будет создан.

    N.B просто поддерживают его в рабочем состоянии, это автоматически создаст резервные копии (!)

Код

/*
this snippet will watch a specific file (args[1]) for changes, make a time-
stamped copy into a set directory (args[2]). The advantage is that any file
can be watched, independent to the application it is edited with.
have fun!
Jacob Vlijm
*/

namespace watchout {

    File watched;
    string watched_fname;
    string watched_fpath;
    string target_fpath;

    public static void main(string[] args) {
        string watched_file = args[1];
        target_fpath = args[2];
        watched = File.new_for_path(watched_file);
        string[] fdata = getnamedata(watched_file);
        watched_fpath = fdata[0];
        watched_fname = fdata[1];
        MainLoop loop = new MainLoop();
        try {
            FileMonitor monitor = watched.monitor(FileMonitorFlags.NONE, null);
            monitor.changed.connect(dosomething);
            loop.run();
        }
        catch (Error e) {
        }
    }

    private string[] getnamedata (string watched_file) {
        string[] watched_data = watched_file.split("/");
        int len_data = watched_data.length;
        string path = string.joinv("/", watched_data[0:len_data - 1]);
        string fname = watched_data[len_data - 1];
        return {path, fname};
    }

    private void dosomething(
        File file, File? otherfile, FileMonitorEvent event
    ) {
        // event types:  https://valadoc.org/gio-2.0/GLib.FileMonitorEvent.html
        if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
            makebackup();
        }
    }

    private void makebackup () {
        var now = new DateTime.now_local();
        string datestring = now.format("%Y-%m-%d_%H-%M-%S");
        string targetstring = target_fpath.concat("/", datestring, "_", watched_fname);
        File target = File.new_for_path(targetstring);
        try {
            watched.copy (target, 0, null, () => {
            });
        } catch (Error e) {
            print ("Error: %s\n", e.message);
        }
    }
}

Установка

  1. Установка valac(чтобы смочь скомпилировать)

    sudo apt install valac
    
  2. Скопируйте отрывок выше в пустой файл, сохранение как watchout.vala

  3. Скомпилируйте его с:

    valac --pkg gio-2.0 /path/to/watchout.vala
    
  4. Выполните его, как описано в том, Как это работает
2
ответ дан 2 December 2019 в 03:27

Другие вопросы по тегам:

Похожие вопросы: