x11 , а не Wayland
Я часто редактирую различные текстовые файлы, такие как .css, .mkd, .sh и .txt, а также .odt Файлы и .ods .
Все мои файлы имеют
[0-9a-zA-Z_]
Geany 1.32 поставляется с настраиваемым плагином для автоматического сохранения резервной копии с меткой времени в месте назначения по выбору пользователя. Например, временная резервная копия ~ / .bashrc выглядит следующим образом:
/home/dkb/Public/GeanyBackups/.bashrc.2019-08-28-16-25-51
Гедит предложил нечто подобное лет назад. Восстановление этой функции может быть по-прежнему возможно с помощью плагина Manage External Tools…. Ответы здесь иллюстрируют использование этого плагина.
Насколько мне известно, в других текстовых редакторах, таких как featherpad , kate , leafpad и коврик для мыши , нет такая особенность. Даже LibreOffice сохраняет только одну резервную копию (если она включена в Инструменты> Параметры> LibreOffice> Загрузить / Сохранить ).
Можно использовать rsync для резервного копирования файлов в папки с метками времени, но я хочу делать резервные копии довольно частых изменений в месте назначения по своему выбору.
Я хотел бы иметь сценарий, который позволяет мне выполнять обычное сохранение и сразу после этого создавать временную резервную копию ограниченного класса файлов, которые я редактирую в своих различных текстовых редакторах или в LibreOffice. Я бы связал этот скрипт с сочетанием клавиш, оставив обычные сочетания клавиш по-прежнему доступными.
Я придумал следующий сценарий, 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
Если Вы не боитесь компиляции 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);
}
}
}
Установка valac
(чтобы смочь скомпилировать)
sudo apt install valac
Скопируйте отрывок выше в пустой файл, сохранение как watchout.vala
Скомпилируйте его с:
valac --pkg gio-2.0 /path/to/watchout.vala