Vis*_*are 5 directory shell-script files
在 Gnome 的文件管理器 (Nautilus) 中,有一个名为“最近的文件”的功能,它表现为某种“虚拟目录”,列出用户主目录中最近创建/修改的文件。
我在 CLI 上寻找等效的东西。即可以导航到的虚拟文件夹,但它根据 find 命令的输出呈现动态结果。
我的需求源于我使用 emacs 发送电子邮件,并且需要指定每个文件附件的路径,因此从不同文件夹发送文件附件是一种痛苦。如果有一个我知道所有最近创建/修改的文件的虚拟目录,生活会更好。
如果没有现成的工具,我会编写一个脚本来运行find搜索$HOME目录中最新文件的命令,并创建一个虚拟文件夹,其中包含指向 find 输出的文件的符号链接;并将其作为 cron 运行或使用 inotify。
但是,如果已经有一个工具可以完成这项工作,那就太好了。
~/.local/share/recently-used.xbel这将获取(或者更确切地说, )中引用的最近使用的文件${XDG_DATA_HOME}/recently-used.xbel,并将它们全部链接到名为 的目录中~/recent:
#!/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\nRun Code Online (Sandbox Code Playgroud)\n\n这使用XMLStarlet从最近使用的文档列表中提取文件 URI(忽略其他 URI),将它们提供给 Python 脚本,该脚本用 nul 字符替换换行符,然后取消引用转义的 URI(例如 +或%20代替空格),最后将xargs所有文件名提供给它,并将它们提供给ln(GNU 变体)以创建符号链接。
请注意,无论目标文件是否仍然存在,都会创建链接;最近使用的文件列表中经常会包含已被删除的临时文件。
\ngvfs理想情况下,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_linker并PATH使用目录路径作为参数运行它
my_linker /path/to/symlinks
Run Code Online (Sandbox Code Playgroud)
它将在该目录中创建最近使用的文件的符号链接。
1:gvfs-open已被弃用
2:我不熟悉emacs- 也许这整件事可以通过插件或扩展来完成......但我不知道......
这可能不会完美地工作,但这是一个开始:
#!/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)