我的目标是能够右键单击 中的符号链接nemo
,触发一个自定义脚本,强制该链接被重写为相对路径(如果它碰巧拥有绝对路径)。
问题在于它DRAG+SHIFT+CTRL
被硬编码在nemo
to 中以生成绝对路径的符号链接。当我尝试远程访问文件系统时,这会导致问题。
我的问题是我想保留手势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
将指定目录中的所有符号链接转换为相对链接。