鹦鹉螺 - 不支持硬链接?

我终于开始着手努力学习和理解硬链接,以确保我已经掌握了基础知识,尽管我跳过了很多内容。在意识到它们的优点之后,我不禁想知道为什么Ubuntu默认的文件管理器nautilus对它们的支持不够好。
目前,只有一种选项可以创建文件的链接,而且它会创建一个“软”链接。

enter image description here

这个问题的麻烦之处在于,一旦移动或重命名原始文件,它们就会损坏。
问题是:
有没有办法让Nautilus创建一个硬链接,或者通过添加右键菜单选项、键盘快捷方式、插件/脚本/配置来实现创建文件的硬链接?

在终端中,可以使用ln命令创建硬链接。但是问题可能会问…为什么你想要/需要硬链接而不是软链接呢?你了解每种链接对磁盘空间的影响吗? - heynnema
2个回答

显然,这个选项在多年前就被有意地删除了。来自bugzilla.gnome.org上的创建硬链接主题:
几乎没有我们的用户知道硬链接的概念,所以为什么要让他们困惑甚至冒着数据丢失的风险呢?你可以使用nautilus-open-terminal并手动创建硬链接。
好消息是你有两个选项来创建这个功能:
- 通过使用Nautilus Actions - 通过使用Nautilus Scripts

解决方案1:使用Nautilus Actions

1. 首先安装nautilus-actions软件包:

sudo apt update
sudo apt install nautilus-actions

或者使用Ubuntu软件:

install nautilus-actions

2. 运行程序:

run nautilus-actions

3. 前往“首选项”,取消勾选“创建根Nautilus操作菜单”。

nautilus-actions Preferences

勾选此选项后,上下文菜单将会有子菜单等。

4. 点击定义新操作按钮,在操作选项卡中填写数据。作为上下文标签,您可以使用创建硬链接,同时仅勾选在选择上下文菜单中显示项目选项 - 换句话说,当选择文件时显示该项目。

Define new action - Action

5. 前往命令选项卡并填写参数:

  • 配置文件

  • 标签默认配置文件 - 如果没有任何自定义配置文件。

  • 命令

  • 路径/bin/ln - 这是可执行文件(或命令)的路径。

  • 参数%f "到"%b"的硬链接" - 点击传说按钮获取更多信息。

  • 工作目录%d - 表示当前目录。

Define new action - Command

6. 由于目录硬链接会破坏文件系统的多个方面,我们必须禁用此可能性。转到媒体类型选项卡并添加一个新规则
  • 媒体类型过滤器inode/directory
  • 选择不能匹配任何一个选项。

Define new action - Mimetypes

7. 记录“创建硬链接”操作:

Define new action - Record

8. 运行Nautilus并从上下文菜单中使用“创建硬链接”操作:

enter image description here


此外,如果您想备份您的设置:
  • 文件$HOME/.config/nautilus-actions/nautilus-actions.conf包含了Nautilus Actions的偏好设置。
  • 新的操作将被放置在文件夹$HOME/.local/share/file-manager/actions/中。

解决方案2:使用Nautilus脚本

通过一个脚本放置在$HOME/.local/share/nautilus/scripts/目录下,也可以实现相同的结果。这个脚本可能如下所示:

$ cat "$HOME/.local/share/nautilus/scripts/Make Hard Link"

#!/bin/bash
if [[ -f "$1" ]]
then
        ln "$1" "Hard Link to $1"
fi

我们可以通过以下命令创建这个脚本并赋予它可执行权限:
ScriptNAME="$HOME/.local/share/nautilus/scripts/Make Hard Link" && \
printf '#!/bin/bash\nif [[ -f \"$1\" ]]\nthen\n\tln \"$1\" \"Hard Link to $1\"\nfi\n' |\
tee "$ScriptNAME" && chmod +x "$ScriptNAME"

结果将是:

enter image description here

参考资料:


嘿,它有效了。感觉有点奇怪要执行一堆基于图形界面的步骤。既然我已经设置好了,以后我可以直接复制/覆盖一些配置文件吗? - Programster
嗨 @Programster,我们可以这样使用find命令在这个链接中:find $HOME -mmin -360 | grep action - 查找用户主目录下在最近6小时内更改过且文件名包含字符串'action'的所有文件。我明天会更新答案,我认为我们根本不需要'Nautilus Actions'。也许只需将一个.desktop文件放置在$HOME/.local/share/file-manager/actions/中就足够了。 - pa4080
@Programster,我已经用另一种方法更新了答案。 - pa4080
谢谢 - 只是一个建议,将脚本方法移到顶部 - 我差点错过它。 - Mike McKay
谢谢你的建议,@MikeMcKay。我已经做了一些修改 :) - pa4080
1非常感谢,我觉得你的答案非常有用。脚本的稍微改进版本为:[ln "$1" "$(dirname $1)/Hard Link to $(basename $1)"] - 当在展开的树中点击文件时,它也可以正常工作。 - CarlosRuiz
嗨,@CarlosRuiz,欢迎你用你的改进方案更新答案。 - pa4080

受到这里的答案的启发,我写了一个Nautilus/Nemo脚本,可以从多个文件选择中创建硬链接。
#!/bin/bash
# make hard links for multiple file selection
# be careful of not moving the hard link to a different file system
HARDLINK_ICON=${HOME}/.local/share/icons/mine/folder-green-activities-icon.png
for arg 
do
    # make a hard link of the selected file
    if [[ -f "$arg" ]] 
    then
        HARDLINK_NAME="Hard Link to $arg"
        ln "$arg" "${HARDLINK_NAME}"
        gio set -t string "${HARDLINK_NAME}" metadata::custom-icon file:///${HARDLINK_ICON}
    fi
done

确保将图标添加到本地主文件夹中。类似于${HOME}/.local/share/icons/mine/folder-green-activities-icon.png这样的路径。
请注意不要将硬链接移动到不同的文件系统,否则它将无法工作。如果图标未显示,则很可能是因为将硬链接剪切并粘贴到了不同的文件系统中。

1谢谢。这个改变使得脚本也能够在扩展树中使用文件 [HARDLINK_NAME="$(dirname $arg)/Hard Link to $(basename $arg)"]。 - CarlosRuiz
这样可以使其与扩展的树和文件名中的空格一起工作: HARDLINK_NAME="$(dirname "$arg")/$(basename "$arg")的硬链接" - Andrei B