在 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
gvfs
gio
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_linker
并PATH
使用目录路径作为参数运行它
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