如何为我编辑的某些文件创建带时间戳的备份?

如何为我编辑的某些文件创建带时间戳的备份?

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

Geany 允许带时间戳的备份

Gedit 提供相似的东西年前。重新获得这一功能可能仍然可以使用管理外部工具…插件。答案这里说明该插件的用法。

据我所知,其他纯文本编辑器,例如羽毛垫凯特叶垫鼠标垫没有这样的功能。即使 LibreOffice 也只保存一个备份(如果在工具 > 选项 > LibreOffice > 加载/保存)。

可以使用同步将文件备份到带时间戳的文件夹,但我想在我选择的目的地捕获相当频繁的编辑的备份。

我希望有一个脚本,允许我执行常规保存,然后立即生成我在各种文本编辑器或 LibreOffice 中编辑的有限类别文件的带时间戳的备份。我会将此脚本绑定到键盘快捷键,同时保持常规快捷键仍然可用。

答案1

自动对任何特定文件进行带时间戳的备份

如果您不怕编译文件vala,可以使用下面的代码片段。优点是它是基于信号的(使用FileMonitor),并且资源消耗为零。此外,您不需要额外的手动操作。

怎么运行的

  • 只需使用监视的文件和目标目录(保存备份)作为参数运行可执行文件,例如

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

    每次将文件test保存(因此更改)到磁盘上时,都会进行如下备份:

    2019-08-29_09-14-26_test
    

    将被创建。

    注意:只要保持它运行,它就会自动创建备份(!)

代码

/*
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

我想出了以下脚本,时间戳,并指定++Ctrl来运行它。SuperT

#!/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')"
  • 脚本使用工具模拟按键并检测窗口标题,因为 gedit 与其他编辑器不同,它不使用“遗留” Alt++ FS

  • 部分代码nwt来自这里

  • ${s##*/}描述使用这里

  • 睡觉具有良好规格的机器可能不需要 s。

生成的备份文件名如下所示:

/home/dkb/Public/find-Carla-Schroder.mkd-20190829222116

相关内容