nemo:上下文菜单操作触发脚本,强制选定的符号链接是相对的

nemo:上下文菜单操作触发脚本,强制选定的符号链接是相对的

我的目标是能够右键单击 中的符号链接nemo,触发一个自定义脚本,强制该链接被重写为相对路径(如果它碰巧拥有绝对路径)。

问题在于它DRAG+SHIFT+CTRL被硬编码在nemoto 中以生成绝对路径的符号链接。当我尝试远程访问文件系统时,这会导致问题。

我的问题是我想保留手势DRAG+SHIFT+CTRL,我不想nemo从源代码构建,并且我希望能够远程浏览任意数量的不相关链接的目录。

我提出的解决方案是在其中创建一个新的上下文菜单选项,nemo这将允许我通过触发脚本来“修复”这些链接中的任何一个。

我已经通过创建新的成功创建了上下文菜单选项.nemo_action我已通过使用创建新文件GitHub 上的模板

这些类型的文件有两个目录:

  • /usr/share/nemo/actions/用于全系统行动
  • $HOME/.local/share/nemo/actions/用于用户操作

我的fix-link.nemo_action文件如下:

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=nodirs;
EscapeSpaces=true

我的fix-link.sh文件(在同一目录中)如下:

#!/bin/bash
$(ln "-rs" $(readlink -f "$1") "$1.tmp")
mv -f "$1.tmp" $(readlink -f "$1")
exit 0

我的临时文件创建得很好,但它拒绝覆盖$(readlink -f "$1").我认为这可能与nemo我最初 DRAG+SHIFT+CTRLl创建绝对路径链接时设置的权限有关。

编辑

@Gilles 修复了我的脚本中的许多错误,此时我发现我还需要将文件Extensions=nodirs;中的行更改fix-link.nemo_action为 read Extensions=any;,否则我将无法通过上下文菜单激活此脚本,甚至链接到一个目录,这就是这个东西的全部目的。

所以现在

fix-link.nemo_action如下:

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=any;
EscapeSpaces=true

我的fix-link.sh文件如下:

#!/bin/bash
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

世界一切都好。谢谢大家。

答案1

您的脚本存在几个问题。

  • 缺少双引号大约$(readlink …)。如果链接目标包含空格或通配符,则会中断。
  • 您正在使用命令替换命令ln,并将结果用作要运行的命令。幸运的是,这不会造成任何损害,因为ln不会产生任何输出。
  • 您的mv命令将符号链接移动到目标位置,这是没有意义的。

我想这就是你想写的:

#!/bin/sh
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

或者,您可以使用symlinks实用程序(最初由 Mark Lords,现在由 J. Brandt Buckley 维护),存在于许多 Linux 发行版中。该命令symlinks -c /path/to/directory将指定目录中的所有符号链接转换为相对链接。

相关内容