CLI 相当于 Gnome 的最近文件功能

CLI 相当于 Gnome 的最近文件功能

在 Gnome 的文件管理器 (Nautilus) 中,有一个称为“最近文件”的功能,它看起来像某种“虚拟目录”,列出了用户主目录中最近创建/修改的文件。

我正在 CLI 上寻找等效的东西。即可以导航到的虚拟文件夹,但它根据 find 命令的输出显示动态结果。

我的需求源于这样一个事实:我使用 emacs 发送电子邮件,并且需要指定每个文件附件的路径,因此从不同文件夹发送文件附件是一件痛苦的事情。如果有一个我知道包含所有最近创建/修改的文件的虚拟目录,生活会更好。

如果没有现成的工具,我会编写一个脚本来运行find搜索目录中最新文件的命令$HOME,并创建一个虚拟文件夹,其中包含 find 输出的文件的符号链接;并将其作为 cron 运行或使用 inotify。

然而,如果已经有一个工具可以完成这项工作,那就太好了。

答案1

这将获取最近使用的文件~/.local/share/recently-used.xbel(或者更确切地说,${XDG_DATA_HOME}/recently-used.xbel),并将它们全部链接到一个名为 的目录中~/recent

#!/bin/sh
set -e
mkdir -p ~/recent
rm -f ~/recent/*       # Make sure you don’t have anything you care about here
xmlstarlet sel -t -m '/xbel/bookmark[starts-with(@href, "file://")]' \
    -v 'substring(@href, 8)' -n ${XDG_DATA_HOME:-~/.local/share}/recently-used.xbel |
python -c "import sys, urllib as ul;
sys.stdout.write(ul.unquote(sys.stdin.read().replace('\n', '\0')));" |
xargs -0 ln -st ~/recent

这使用XML小星从最近使用的文档列表中提取文件 URI(忽略其他 URI),将它们提供给 Python 脚本,该脚本用 nul 字符替换换行符,然后取消引用转义的 URI (例如 +%20代替空格),最后将xargs所有文件名提供给它,并将它们提供给ln(GNU 变体)以创建符号链接。

请注意,无论目标文件是否仍然存在,都会创建链接;最近使用的文件列表中经常会包含已被删除的临时文件。

答案2

理想情况下,CLI 等效项将通过以下方式完成gvfs计划以便能够使用recent:///位置作为参数,例如如上所述这里

nautilus recent:///

1

gio open recent:///

将打开最近使用的文件,就像您使用侧边栏中的按钮nautilus一样。 这对你的情况没有多大帮助,因为你需要2 个能够理解方案的 CLI 工具,而我所知道的唯一一个就是上面提到的。你可以跑Recent
gvfsgio

gio list recent:///

但输出将毫无用处,因为您只能得到gio这些路径的内部表示。要查看它们对应的内容,您可以使用

gio tree recent:///

但除非您对输出进行大量解析/处理,否则这仍然几乎无法使用。但是,您可以编写自己的工具来使用GtkRecentManager做你想做的事。为了帮助您入门,这是一个非常基本的示例python(无错误检查,目标目录必须存在且为空等):

#!/usr/bin/env python

import gi,sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk,Gio
from sys import argv

tg_dir = argv[1]
rec_mgr = Gtk.RecentManager.get_default()
for item in rec_mgr.get_items():
    if item.exists():
        uri = item.get_uri()
        tg = Gio.File.new_for_uri(uri)
        tg_path = tg.get_path()
        b_name = tg.get_basename()
        dt_path = tg_dir + "/" + b_name
        dt = Gio.File.new_for_path(dt_path)
        dt.make_symbolic_link(tg_path, cancellable=None)

如果您将其保存为例如,my_linkerPATH使用目录路径作为参数运行它

my_linker /path/to/symlinks

它将在该目录中创建最近使用的文件的符号链接。


1:gvfs-open已被弃用
2:我不熟悉emacs- 也许这整件事可以通过插件或扩展来完成......但我不知道......

答案3

这可能不会完美地工作,但这是一个开始:

#!/bin/sh

recent_dir=$HOME/recent

mkdir -p "$recent_dir" || exit 1

find "$recent_dir" -type l -ctime +1 -delete

find "$HOME" -type f -mtime -1 -exec sh -c '
    dir=$1; shift
    for pathname do
        link=$dir/${pathname##*/}
        [ -h "$link" ] && continue
        ln -s "$pathname" "$link"
    done' sh "$recent_dir" {} +

该脚本将创建并使用在您的主目录中调用的目录recent(确保该目录尚不存在,或更改脚本中的名称)。

它首先清除recent目录中超过一天的符号链接。

然后,它(仅)查找主目录中或主目录下在过去 24 小时内修改过的所有常规文件,并为每个此类文件在目录中创建一个符号链接recent

如果两个或多个文件具有相同的文件名,则第一个找到的文件获胜。

该脚本还将处理隐藏文件和隐藏目录中的文件。

要从搜索中排除目录,请使用例如

find "$HOME" -type d \( -name '.*' -o -name '*-mail' \) -prune \
    -o -type f -mtime -1 -exec sh -c ...as before...

这将排除隐藏目录和名称以-mail.

要让第一个find也清理已移动或删除的文件的符号链接,请将其更改为

find "$recent_dir" -type l \( -ctime +1 -o ! -exec test -f {} \; \) -delete

相关内容