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

Vis*_*are 5 directory shell-script files

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

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

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

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

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

Ste*_*itt 5

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

\n\n
#!/bin/sh\nset -e\nmkdir -p ~/recent\nrm -f ~/recent/*       # Make sure you don\xe2\x80\x99t have anything you care about here\nxmlstarlet sel -t -m \'/xbel/bookmark[starts-with(@href, "file://")]\' \\\n    -v \'substring(@href, 8)\' -n ${XDG_DATA_HOME:-~/.local/share}/recently-used.xbel |\npython -c "import sys, urllib as ul;\nsys.stdout.write(ul.unquote(sys.stdin.read().replace(\'\\n\', \'\\0\')));" |\nxargs -0 ln -st ~/recent\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n


don*_*sti 5

gvfs理想情况下,CLI 等效项将通过方案来完成此操作,以便能够使用recent:///位置作为参数,例如,如此处所述

nautilus recent:///
Run Code Online (Sandbox Code Playgroud)

1

gio open recent:///
Run Code Online (Sandbox Code Playgroud)

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

gio list recent:///
Run Code Online (Sandbox Code Playgroud)

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

gio tree recent:///
Run Code Online (Sandbox Code Playgroud)

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

nautilus recent:///
Run Code Online (Sandbox Code Playgroud)

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

my_linker /path/to/symlinks
Run Code Online (Sandbox Code Playgroud)

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


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


Kus*_*nda 1

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

#!/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" {} +
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

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

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

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