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
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);
}
}
}
设置
安装
valac
(以便能够编译)sudo apt install valac
将上面的代码片段复制到一个空文件中,保存如下
watchout.vala
使用以下命令进行编译:
valac --pkg gio-2.0 /path/to/watchout.vala
- 按照说明运行怎么运行的
答案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++ F。S
部分代码
nwt
来自这里。${s##*/}
描述使用这里。这睡觉具有良好规格的机器可能不需要 s。
生成的备份文件名如下所示:
/home/dkb/Public/find-Carla-Schroder.mkd-20190829222116